str[101]までしかないのに???

このQ&Aのポイント
  • C言語のプログラムで、配列str[101]には101個の要素がありますが、そのすべてを表示することはできません。
  • プログラムの最後の要素はstr[101]ではなく、str[100]なので、表示されません。
  • したがって、最後の要素5050は表示されず、その直前の要素4950が最後に表示されます。
回答を見る
  • ベストアンサー

str[101]までしかないのに???

#include<stdio.h> int main(void){ int str[101]; int *pt,i,a,count=0; pt=str; *pt=0; for(i=0;i<101;i++){ a=*pt+i; pt++; *pt=a; printf("%5d",*pt); count++; if(0==(count%10)){ putchar('\n'); } } return 0; } の答えが 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656 4753 4851 4950 5050 なんですが、str[101]までしかないのに最後の5050はstr[102]なので表示されないと思うんですが、何故表示されるのか分かりません。お願いします(_ _)

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

  • ベストアンサー
  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

int str[101] は単に int で 101 個の領域を確保しただけでその先のメモリ領域に関しては関与していません。 だから str[101] は既に確保した領域外なので、ここになんか書き込むと 1. 次の変数 pt の領域に書き込む。 2. 関数の戻り先の番地を上書きする 3. その他 となりますが、これはコンパイラによって異なります。 宣言のところを int str0[101]; int str[101]; int str1[101]; としておけば str 配列はどんなコンパイラでも str[200] まで使えるでしょう。 このいいかげんさがCの良さ

c-gongo
質問者

お礼

他に書き込みとは@@ 理解できました。ありがとうございました(_ _)

その他の回答 (1)

  • popokoku
  • ベストアンサー率65% (71/109)
回答No.2

これって自然数0~nの和をそれぞれ求めてるんですよね? そうであれば、100までの和が5050になるから結果はおかしくないと思うのですが… (ちなみに102までの和は5253)

c-gongo
質問者

補足

実はstr[0]とstr[1]はどちらも0でstr[0]は表示されてません。 str[1]だけが表示されてます。 これは問題を見て、自分で書いたのでややこしいんですwわかりにくくてすみません。

関連するQ&A

  • for文

    以下のプログラムのforの条件文がなぜこれで動くのかよくわからないので 教えていただけないでしょうか? #include<stdio.h> int main(void) { int i; char str[] = "ABC"; char *ptr = "123"; for(i=0;str[i];i++) putchar(str[i]); putchar('\n'); for(i=0;ptr[i];i++) putchar(ptr[i]); putchar('\n'); printf("str = \"%s\"\n",str); printf("ptr = \"%s\"\n",ptr); return(0); }

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

  • 直角三角形を表示するプログラム

    下記のプログラムを実行するとコマンドプロントになにも表示されず、強制終了しなければならなくなってしまいます。 whileのところがおかしいのはわかったのですが、この書き方の何がいけないのかが分かりません。 初歩的な質問で申し訳ありませんが、回答していただけると有難いです。 #include <stdio.h> int main(void){ int count, i; printf("何段ですか?"); scanf("%d", &count); for(i = 1; i <= count; i++){ while(i-- > 0){ putchar('*'); } putchar('\n'); } return 0; }

  • プログラミング 関数

    教えてください。 入力された文字列のうち、文字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; }

  • 2つのプログラムの違い

    どうしても分からなかったので投稿しました。よろしくお願いします。 #include<stdio.h> int main(void) { int c; while((c=getchar())!=EOF){ putchar(c); } return 0; } のプログラムをコマンドプロンプトで入力すると、 abc abc なんですが、 #include<stdio.h> int main(void) { int c,i; i=0; while ((c=getchar())!=EOF) { putchar(c); i++; printf("%d\n",i); } return 0; } の場合、 abc a1 a2 a3 4 になります。 自分は abc a1 a2 a3 になると思ったのですが、a3と4の隙間と4は何故出て来たのでしょうか?

  • 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が含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • 困っています

    これを三段で実行してみたのですが、うまく表示できません。下のようになります。どこが間違っているか教えてください。お願いします。          *         *        * #include <stdio.h> int main(void) { int i, j, ln; printf("何段を表示しますか?"); scanf("%d", &ln); for(i=1; i<=ln; i++){ for(j=1; j<=ln-i; j++) putchar(' '); for(j=1; j<=i * 2 - 1; j++); putchar('*'); putchar('\n'); } return(0); }

  • [C]char型のダブルポインタ

    粗雑で申し訳ありませんが、 以下のソースをコンパイルできましたが、 うまく実行できません。 自分なりに間違いがないと思うのですが、 間違い等をご指摘頂ければ助かります。 #include <stdio.h> void func(char **ptr) ptr[][10] か (*ptr)[] なら通る *ptr[] は通らない { printf("----- func -----"); printf("%s\n", *ptr); printf("%c\n", **ptr); putchar('\n'); } int main(void) { char str[5][10] = {"AAAAA", *str[] にすると func で **ptr で通る "BBBBB", "CCCCC", "DDDDD", "EEEEE", }; printf("----- main -----"); printf("%s\n", *str); printf("%c\n", **str); putchar('\n'); func(str); return (0); } 実行結果 ----- main ----- AAAAA A ----- func ----- Bus error (core dump) 関数への受け渡しで、型が違うというお叱りを受けますが、 コンパイルはできました。 コンパイラはCCです。 ではよろしくお願いします。

  • パイプってどうやって使うの?

    1つ目のプログラムの出力を2つ目のプログラムで受け取りたいのですが、どうすればいいですか? -- 1 -- #include <stdio.h> #include <windows.h> int main(void){     int a=0;     while(1){         fprintf(stdout,"%d\n",a++);         Sleep(1000);     }     return 0; } これを2のプログラムで受け取ります。 #include <stdio.h> int main(void){     char str[128];     while(1){         if(fgets(str,sizeof(str),stdin)==NULL)             break;     printf("%s",str);     }     return 0; } これをコマンドプロンプトで 1 | 2 と入力してみましたが、何も表示されません・・。 個別に実行すると正常に動作します。 環境はXPです。どうしたら受け渡しが出来るのでしょうか?

専門家に質問してみよう