- ベストアンサー
かぶった文字を消すプログラム
- 文字列s2中の任意の文字に等しい文字をs1から除外するプログラムを作成しましたが、出力が出ません。
- プログラムの問題点を調べ、修正してください。
- ビルトと入力はできるものの、出力がされない理由を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
s[]、t[]にはヌル文字をセットしていないので、その後のfor文ループで止まれません。 なので、s[]、t[]の終端にヌル文字をセットしてやります。 for( i = 0; (c = getchar()) != '\n'; i++){ s[i] = c; } s[i] = '\0'; // ←追加 for( i = 0; ((c = getchar()) != '\n') && (c != EOF); i++){ t[i] = c; } t[i] = '\0'; // ←追加 また最後の出力で%sで指定しているので、for文は不要。 printf("%s", s);の1行でOK。
その他の回答 (5)
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
>ビルトと入力は出来るものの、出力が出ません。何が間違っているのでしょう? 質問プログラムの内容をそのままにして直してみました。 1.文字列入力の for()文は、改行('\n')コードを読んだ時点でメモリに格納せずに終わっています。したがって、それ以降の文字は不定のままになっています。 解決方法は for()文の後に「s[i] = '\0';」とか「t[i] = '\0';」とか追加して文字列を区切る必要があります。ここでは static char として文字配列 s[]、t[] を初期化して、これを代用し、プログラムの修正箇所を少なくしています。 2.かぶった文字を消す部分の for()文は、まず、読み込んだ文字列が「'\0'」で区切られていることが大前提です。それは区切られていませんでしたから、動くはずもありません。 内容については、二重ループになっていることから、かぶる文字は各1文字づつの操作となっています。つまり、「abcdef」の文字について「bd」の文字を消そうとすると「bd」の文字列はないのに「b」と「d」の文字が消されるプログラム内容になっています。この辺りはちょっとヘンかなと思います。 3.出力は、文字列についてのみ行い、改行「"\n"」は格納文字列に含まれていません。よって、別途改行してやる必要があります。また、書式付き出力の printf() よりは、1文字出力の putchar() 関数のほうが合っているように思います。 4.今はCの学習中なのでしょうが、読み込みは fgets()関数が簡単で良いでしょうし、結果の出力についても printf()の1行で事足りてしまいます。 #include <stdio.h> int main(void) { int i,j,c; static char s[100],t[100]; printf("Input strings: "); for( i = 0; (c = getchar()) != '\n'; i++){ s[i] = c; } printf("Input cutting word: "); for( i = 0; ((c = getchar()) != '\n') && (c != EOF); i++){ t[i] = c; } for( i = 0; s[i] != '\0'; i++){ for( j=0; t[j] != '\0'; j++){ if( s[i] == t[j] ){ s[i] = ' '; } } } for( i = 0; s[i] != '\0'; ++i ){ printf("%c", s[i]); // 1字出力 } printf("\n"); // 改行して完 return 0; }
- asuncion
- ベストアンサー率33% (2127/6290)
「除外する」の仕様がよくわかりません。 そこで、入力と出力の例を挙げてみてください。
- kmee
- ベストアンサー率55% (1857/3366)
> printf("%s", s[i]); %sに対応する型は char *(あるいは、それと同等のchar [])です。 sがchar[] なら s[i]は何になると思いますか? コンパイラによっては、書式と型の不一致を警告してくれるものもありますが、エラーではないのでビルドは成功します。また、警告すらしないコンパイラも多いです。 他には細かい点ですが > main() こんな書き方をしている参考書をお持ちなら、新しいのを買いましょう。 > for( i = 0; (c = getchar()) != '\n'; i++){ > s[i] = c; > } 1行読み込むなら、標準関数には fgets , gets という便利なものがあります。 > 等しい文字をs1から除外する ここで言う「除外」とは、「該当文字をスペースに置き換える」ことでよろしいでしょうか? そうでないなら、 >for( i = 0; s[i] != '\0'; i++){ > for( j=0; t[j] != '\0'; j++){ (略) の部分は間違いになります
- askaaska
- ベストアンサー率35% (1455/4149)
良く見ると最後は printf("%c", s[i]); よね。
- askaaska
- ベストアンサー率35% (1455/4149)
s[i] != '\0' にマッチングするものがない ってことでしょう? 私の手元には確認できる環境がないのでできないけど 面倒でも各処理の途中経過をprintしてみてはどお?