プロが教える店舗&オフィスのセキュリティ対策術

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);
}

A 回答 (5件)

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);
}
    • good
    • 0

皆さんおっしゃるように,「姓」と「名」にわけて読み込むとして,



文字列の長さを測るのは strlen 関数を使うといいですよ。
#include <string.h>

char a[] = "12345";
printf("%d\n", strlen(a));

# 使っちゃいかんのかな?
    • good
    • 0

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

    • good
    • 0

scanf関数では空白を文字列の終わりとみているので、


"姓 名"とすると姓しか読めません。
    • good
    • 0

for()のあとにセミコロンがあるのはなぜでしょうか?


2つのfor()のあとにあるセミコロンを削除してから実行してみてください。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!