「c言語の空白を含む文字列に含まれる単語をある配列にコピーし、それを単語長とともに出力する」問題が学校の課題として課されたのですが、出題者の言葉足らずなのか自分の読解力・理解力不足なのか問題の意図(やらせようとしていること、またはどこがポイントなのか)が理解できない上、コードの正解がわからないという質問です。
問題は下の画像です。ちなみにこの問題では今は危険性ゆえに使用されていないgets関数を使うという条件でした。
そして、問題文で触れられている基礎課題2の問題が下の画像です。
この基礎課題2は自力で解けました。以下のコードです。
c
1#include<stdio.h> 2int str_copy(char a[],char b[]); 3 4int main() 5{ 6 char a[128]; 7 char b[128]; 8 9 printf("Input : "); 10 scanf("%s",b); 11 12 printf(" ( %d )\n",str_copy(a,b)); 13} 14 15int str_copy(char a[],char b[]) 16{ 17 int i=0,len=0; 18 19 while(b[i]!='\0') 20 { 21 a[i]=b[i]; 22 i++; 23 len++; 24 } 25 a[i]='\0'; 26 printf("Output : %s",a); 27 return len; 28}
そして、自力で基礎課題3を解こうとして書いたコードが以下です。上記の通り全く意図が汲み取れずにめちゃくちゃなコードになった上にコンパイル結果も当然回答には程遠いものとなりました。
c
1#include<stdio.h> 2int str_copy(char a[],char b[]); 3 4int main() 5{ 6 char a[128]; 7 char b[128]; 8 char c[128]; 9 10 printf("Input : "); 11 gets(b); 12 13 printf(" ( %d ) ",str_copy(a,b)); 14 while(str_copy(a,c)!=0){ 15 printf(" ( %d ) ",str_copy(a,c)); 16 } 17 printf("\n"); 18 19 20 21} 22 23int str_copy(char a[],char b[]) 24{ 25 int i=0,len=0; 26 static char *p; 27 static int flag=0; 28 29 while(flag==0){ 30 if(b[i]!=' '){ 31 a[i]=b[i]; 32 len++; 33 } 34 35 if(b[i+1]==' ' && b[i]!=' '){ 36 len++; 37 flag++; 38 i++; 39 p=&b[i]; 40 while(*p == ' '){ 41 p++; 42 } 43 printf("Output : %s",a); 44 break; 45 } 46 47 i++; 48 } 49 50 51 if(*p=='\0'){ 52 return 0; 53 } 54 55 if(b[0]=='\0'){ 56 while(*p != ' ' || *p!='\0'){ 57 a[i] = *p; 58 p++; 59 i++; 60 len++; 61 } 62 printf("%s",a); 63 64 while(*p == ' '){ 65 p++; 66 } 67 } 68 69 return len; 70}
この問題には正解のコンパイル結果の例があったのですが、実行ファイル名をex01と仮定すると、(△は空白です)
ex01
Input: △ △ △ abcd △ △ △ efg △ △ △ hi
Output: abcd ( 4 ) efg( 8 ) hi ( 2 )
というものです。
この問題の特にわからない点は、
・なぜ2回目以降の第2引数をNULLで固定して呼び出すのか
・戻り値が0なら終了としているのはなぜか
またこの問題が自分が分からない要因として、gets関数が空白をどういう値で配列に格納しているのかが調べてもわからない(調べたがscanfとの空白で終了するかしないかの違いにしか触れられていなかった)というのもあります。
この問題の意図またそれを実現するコードがわかる方がいましたら教えてくれる助かります。
回答2件
あなたの回答
tips
プレビュー