• ベストアンサー

c言語

c言語の問題なんですが 氏名を姓と名に半角空けて1列に入力し、姓と名の文字数を数えるプログラムを書いてみましたがうまく走りません原因がわからないので誰か教えてください。ちなみに、書いたプログラムは、 #include <stdio.h> void mojisu(char z[] ); int main() { char z[30]; printf("氏名を英語で入力\n"); scanf("%s\n",&z); mojisu(z); } void mojisu(char z[] ) { int sei,mei, b; for(b =0,sei=0; z[b]==' '; b++); { sei+=1; } printf("姓の文字数は%d\n",sei); for(b =sei+1,mei=0 ; z[b]=='\0'; b++); { mei+=1; } printf("名の文字数は%d\n", mei); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

No1です 追加です。いろいろ間違いがみつかりました。。。 scanfですが、文字を格納する変数はポインタを指定する必要があります。 この場合&zとやってしまうとポインタのポインタを指定したことになります。 ここは単にzでいいです。 また#2さんが回答されているように空白が文字の切目と されるため、二つの文字列変数を用意する必要があります。 forループの繰り返しの条件がおかしいと思います。 forは「条件を満している限り繰り返す」ので 「z[b]==' '」や「z[b]=='\0'」ではなく「z[b]!=' '」や「z[b]!='\0'」とする必要があります。 これはプログラムをみたほうが分かりやすいと思います。 #include <stdio.h> void mojisu(char z1[], char z2[]); int main() { char z1[30], z2[30]; printf("氏名を英語で入力\n"); scanf("%s %s",z1, z2); mojisu(z1, z2); } void mojisu(char z1[], char z2[]) { int b; for(b =0; z1[b]!='\0'; b++); printf("姓の文字数は%d\n",b); for(b =0; z2[b]!='\0'; b++); printf("名の文字数は%d\n", b); }

その他の回答 (4)

noname#5537
noname#5537
回答No.5

皆さんおっしゃるように,「姓」と「名」にわけて読み込むとして, 文字列の長さを測るのは strlen 関数を使うといいですよ。 #include <string.h> char a[] = "12345"; printf("%d\n", strlen(a)); # 使っちゃいかんのかな?

回答No.3

配列を2つ(姓、名それぞれ)用意すれば簡単に出せるんではないでしょうか。

  • hitomit
  • ベストアンサー率16% (3/18)
回答No.2

scanf関数では空白を文字列の終わりとみているので、 "姓 名"とすると姓しか読めません。

回答No.1

for()のあとにセミコロンがあるのはなぜでしょうか? 2つのfor()のあとにあるセミコロンを削除してから実行してみてください。

関連するQ&A