• 締切済み

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

sakusaker7の回答

  • 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; } サンプルのためエラーチェックが甘かったりしますので使うなら 適当に直してくださいませ。

関連する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に返しているのかが分かりませんでした。教えてください。