• 締切済み

スペースで区切って数字を入力

スペースで区切られた5個の数字を端末から入力し、表示するプログラムが書けずに困っています。 #include<stdio.h> int main(){ char str[5]=={%lf %lf %lf %lf %lf,&a,&b,&c,&d,&e} などと書いていってもよさそうなのですが、数を5→10などと増やしていくと初期化子の数が多すぎでコンパイルで通りません。 配列を用いたよい方法はないでしょうか?

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

strtokはあまり使うことが推奨されない関数です。 Manpage of STRTOK http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html のバグの部分を参照してください。 対策としてはこういう関数を仕立ててみるとか。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int fill_array(char *buf, double *target, size_t array_max) { int count = 0; int maxcount = (int)array_max; char *p, *q; fprintf(stderr, "%s: buf=%p, array_max=%d\n", __FUNCTION__, buf, array_max); if (maxcount <= 0) return -1; for (count=0, p=buf; count < maxcount; count++) { double val; val = strtod(p, &q); fprintf(stderr, "%s: get %f\n", __FUNCTION__, val); if ((val==0 && p==q) || !*q || !isspace(*q)) break; target[count] = val; p=q; } return count; } int main() { int count; int i; char linebuf[1024]; double numbers[10]; double sum; fgets(linebuf, sizeof linebuf, stdin); fprintf(stderr, "input = %s\n", linebuf); count = fill_array(linebuf, numbers, (sizeof numbers/sizeof numbers[0])); fprintf(stderr, "count=%d\n", count); for (i=0, sum=0; i<count; i++) { printf("%02d: %f\n", i, numbers[i]); sum += numbers[i]; } printf("avarage = %f\n", sum/count); return 0; } サンプルのためエラーチェックが甘かったりしますので使うなら 適当に直してくださいませ。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★fgets 関数で読み取った文字列をスペースで分解すればよい。 ・過去に似たような質問がありました。  http://oshiete1.goo.ne.jp/qa2749340.html→『fgetsなどをもちいて「改ページ」までの文字列を読み込みたい』  です。この質問では文字列を『改ページ』文字で分割するにはどうすればよいか、という事でした。  今回はスペース文字ですので『改ページ』文字をスペース文字に置き換えて読んでみて下さい。→回答者 No.3  サンプル・ソースの『改ページのコード』の部分をスペース文字(0x20)にすれば分割された文字列  が seek ポインタで得られます。 ・今回は strtok 関数での分割を下に紹介します。どちらでも分割できますのでお好きな方法で。 サンプル: char buff[ 256 ]; char *line; if ( fgets(buff,sizeof(buff),stdin) != NULL ){ ←端末からの入力  for ( line = strtok(buff," ") ; line != NULL ; line = strtok(NULL," ") ){   /*   分割された文字列 line が得られる   */  } } 解説: ・fgets() 関数で半末から複数のスペースで区切られた文字列を取得します。  その後、for 文中で strtok() 関数でスペースで区切られた文字列を分割しています。  strtok() の使い方は、  1回目…strtok( 分割する文字列, 区切り文字群 )  2回目…strtok( NULL, 区切り文字群 )  3回目…strtok( NULL, 区切り文字群 )    :  n回目…strtok( NULL, 区切り文字群 )  と最初の1回目だけ分割する文字列を第1引数に指定します。→内部に登録される。  その後、区切り文字群を指定することでどんどん分割できます。  区切り文字群は毎回同じでも、違っても良い。→今回はすべてスペース文字なので同じ指定です。 その他: ・for 文中で分割された文字列 line を printf 関数など表示すれば良い。  あと端末からの入力を繰り返すのならば、fgets() 関数の部分を if → while に変更すれば  繰り返します。 ・以上。fgets() と strtok() 関数の組み合わせでした。→他にも strchr での分割もあります。

参考URL:
http://oshiete1.goo.ne.jp/qa2749340.html
全文を見る
すると、全ての回答が全文表示されます。
noname#38837
noname#38837
回答No.1

strtok() じゃだめですか http://www9.plala.or.jp/sgwr-t/lib/strtok.html

emiko1986
質問者

補足

ご回答ありがとうございます。strtok()を使用したものも考えて見ます。 fgets()とsscanf()を組み合わせて使用する、という場合はどうなるでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタ スペースを数えるプログラム

    入力した文章のスペースを数えるプログラムを作ってみました. ポインタをまだしっかり理解していないのですが,ポインタを使用 する場合,以下のようなプログラムで正しいですか? (オーバーフローなどについては対処していません.) #include<stdio.h> int main(void) { char str[80],*p; int i,count=0; gets(str); p=str; for(i=0;i<80;i++) { if(p[i]==' ') { count++; } } printf("%d",count); return 0; }

  • C言語 strcmp 半角スペースがあるとだめ?

    C言語 strcmp 半角スペースが文字列に含まれている場合 文字列の比較がうまくいきません。半角スペースがあると比較できないのでしょうか? プログラム //strcmp #include <stdio.h> #include <string.h> int main(void){ char input[256]; char str[] = "HelloWorld!";   //char str[] = "Hello World!";だとうまくいかない。 printf("%s\n>", str); scanf("%s", input); if ( strcmp(input, str) == 0){ printf("同じです。\n"); }else{ printf("違います。\n"); } return 0; }

  • C言語のint型の配列が分かりません

    #include<stdio.h> int main(void) { int str[ ]={0,1,2} printf("%s\n", str); return 0; } というプログラムをC言語でつくってみましたが動きません.(012と表示されて欲しかったのですが) int str[ ]={1,2,3}の部分をchar str[ ]={'0','1','2'}とすれば動きます. そこで質問なのですが, printf("~%s~", (配列名));  はchar型の配列にしか適応できないのですか? ※追記 puts関数の定義は int puts (const char *str); であるそうなので char型の仮引数にはchar型のアドレスを渡さなければいけません. ではprintf関数の定義は一体どんなものなのですか?

  • int とcharの使い方と違い

    教えてgooに投稿するのは初めてですがよろしくお願いします。 最近C言語を勉強し始めた初心者です。 ネットのサイトを見て独学でしています。 過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL) #include<stdio.h> int main(void) { int str='a'; printf("str=%c\n",str); return0; } この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、 #include<stdio.h> int main(void) { int str[]="abc"; printf("str=%s\n",str); return0; } とするとエラーが出ます。 int とcharの使い方と違いについて詳しく教えてほしいです>< お願いします。

  • 入力された文字列の中の数字を全てを削除するプログラム(C言語)

    入力された文字列の中の数字を全てを削除するプログラム(C言語) 柴田望洋さんの「明解C言語入門編」という本の演習11-5に当たるこのプログラムの作り方がどうしてもわかりません。 なんとか書いてみましたが、実行してもうまくいきません。 どこが悪いのか自分でもわかりません。 誰か教えてくださいお願いします。 以下が僕が書いたコードです。 #include<stdio.h> void del_digit(char *str){ unsigned i=0; char *a; while(*(str+i)){ if(*(str+i)<0 || *(str+i)>9) *a++=*(str+i); i++; } printf("%s",a); } int main(){ char *str; scanf(" %s",str); del_digit(str); return 0; }

  • ファイルが読み込めない

    testのなかみを test,  22.2,  33.3,  として、 Visual C++ 2005でこれをコンパイルすると、わけのわからない数字がでてきます。 初心者なのでどこが間違ってるのかわかりません。 よろしくお願いします。 #include <stdio.h> int main(void) { char str[20]; double i,j; FILE *file; file = fopen("d:\\test\\test","r"); fscanf(file,"%s, %lf, %lf,",str,&i,&j); fclose(file); printf("i = %f : j = %f\n",i,j); return 0; }

  • char配列のポインタ消去

    char配列のポインタ消去 こんにちは。C++初心者で、現在ポインタと配列の関係を勉強しています。 以下のコードついて質問があります。 #include <stdio.h> extern void main () { char* str = "hello world."; printf(str); delete str; } コンパイルはうまくのですが、 いつもプログラムが正常に終了できません。 deleteをコメントアウトすると正常に終了します。 理由がわかる方いらっしゃるでしょうか。

  • プログラミング 関数

    教えてください。 入力された文字列のうち、文字aの数を数える関数count_aを作成する。 以下は関数count_aを利用したmainのプログラムの例です。 #include <stdio.h> int count_a(char str[]); int main ( void ) { char str[255]="abcaeag"; printf("%d\n",count_a(str)); return 0; }

  • メモリ上に配置されていないバイト配列を代入

    memcpyでメモリ上に配置されていないバイト配列を代入する方法を教えて下さい。 #include<iostream.h> int main() { char str[3]; memcpy(str,"aa",3); printf("%s",str); return 0; } これは分かるんですが、バイト配列では"aa"のところに何を書けばいいんですか? memcpy(str, (char *){0x61,0x61,0x0}, 3);ではコンパイルできませんでした。 str[0]=0x61;のように1つずつなら代入できるんですが、配列ごとの方法が分かりません。

  • 再帰プログラム

    strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。