- ベストアンサー
文字列中の空白部を読み込む方法とプログラムの問題
- 質問者は、キーボードから入力される文字列の空白部分を正しく読み込む方法を知りたいとしています。
- また、質問者は、現在のプログラムが空白部分で停止してしまう問題についてアドバイスを求めています。
- 要約文をまとめると、質問者は文字列の空白部分の読み込み方法とプログラムの問題についてアドバイスを求めています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
scanf()した後のsやmの値を表示してみればいいんじゃないですか。
その他の回答 (4)
- mac_res
- ベストアンサー率36% (568/1571)
scanf(3)を使った別解です。バッファオーバフローの危険性がある点、文字列の長さがBUFSIZの制限を受ける点でNo.3に劣ります。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include<stdio.h> #include<ctype.h> int main(void){ char buf[BUFSIZ]; char *p; int i; printf("please iput sentens\n"); scanf("%[^\n]", buf); i = 0; for (p = buf; *p != 0; p++) { if (isupper(*p)) i++; } printf("Number of upper char = %d.\n", i); return(0); }
補足
No3に引き続きお願いします。 "%[^\n]"とは「文字列として改行まで読み込み」という意味でしょうか?
- mac_res
- ベストアンサー率36% (568/1571)
fgets(3)を使った別解です。文字列がBUFSIZの長さに制限されている点でNo.3に劣ります。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include<stdio.h> #include<ctype.h> int main(void){ char buf[BUFSIZ]; char *p; int i; printf("please iput sentens\n"); fgets(buf,BUFSIZ,stdin); i = 0; for (p = buf; *p != 0; p++) { if (isupper(*p)) i++; } printf("Number of upper char = %d.\n", i); return(0); }
補足
3つも解答を用意していただいてありがとうございます。 失礼ながら私は最近からC言語の勉強を始めたので分からないキーワードが多々あります。。。もしよければ各解答に質問をするので答えて頂けないでしょうか? BUFSIZって何のことでしょうか?別のサイトをみたら「バッファのデフォルト時のサイズ」と書かれていたのですが、そもそもバッファが何かよく分かっていません。。
- mac_res
- ベストアンサー率36% (568/1571)
scanf(3)では空白の前までしか読みませんし、バッファオーバーフローの危険性の問題があります。 数値による大文字の判定はシステム依存性があります。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include<stdio.h> #include<ctype.h> int main(void){ int c; int i; printf("please iput sentens\n"); i = 0; while((c = getchar()) != EOF) { if (c == '\n') break; if (isupper(c)) i++; } printf("Number of upper char is %d.\n", i); return(0); }
補足
EOFとは何ですか?別のサイトで見たら「ファイルの終端を示す」と書かれていたのですが、getchar関数は標準入力なのでファイルとは関係ないような。。。
- smat7
- ベストアンサー率46% (7/15)
空白の判定というよりsの領域確保に問題があります s=(char*)malloc(sizeof(char)); これではsに割り当てられるのは1バイトしかありません scanfを呼んだ段階でメモリ破壊がおきています 必要とする最大文字数分を,例えば #define MAX_STR 256 なら s=(char*)malloc(sizeof(char)*(MAX_STR+1)); などとして確保してください
お礼
ありがとうございます! なるほど動的メモリというだけでただmallocを使えばいいというわけではないんですね。。。勉強になりました!!
お礼
ありがとうございます。 自分の考えていたエラーがそもそもおかしかったことに気づけました。