• ベストアンサー

C言語の初歩的な質問

質問1----------------------------------------- #include<stdio.h> int main() {  int a;  char b[10];  for(int i = 0;i < 2;i++){   scanf("%d",&a);   printf("整数%d\n",a);  }  scanf("%s",b);  printf("文字列%s\n",b); } /* この際に、例えばabと入力すると結果が 整数-858993460 整数-858993460 文字列ab となり整数入力を無視して進められるのはなぜでしょうか? */ 質問2----------------------------------------- #include<stdio.h> void func(int**); int main() {  int *p;  func(&p);  printf("%d",*p); } void func(int **pp) {  int n = 10;  *pp = &n; } /* func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? */ ---------------------------------------------- C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

  • ahys
  • お礼率61% (8/13)

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> この際に、例えばabと入力すると結果が > 整数-858993460 > 整数-858993460 > 文字列ab > となり整数入力を無視して進められるのはなぜでしょうか? scanfの仕様です。 > func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? 未定義の動作ですので、たまたまそうなっただけです。

ahys
質問者

お礼

回答ありがとうございました。 参考になりました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

上の方だけ #1 の補足: scanf の仕様で「変換できなかったら無視して終了」です. 「ab」という入力は整数にできないので, この入力は見なかったことにして scanf は返ってきます. 当然, 入力に残ったままなので結果的に「無視された」ように見えます. このことは scanf の返り値をちゃんと確認すればわかる.

ahys
質問者

お礼

回答ありがとうございました。 仕様とのことで、そう覚えるしかないみたいですね。

  • a987654
  • ベストアンサー率26% (112/415)
回答No.2

>質問1  &a は何を指しているのでしょうか? C言語は一冊の本にaのアドレスとと書かれていませんでしょうか? すなわちコンパイルじに変数aに割りつけられたアドレスそのものです。 >質問2 >寿命がなくなるはず なんで? 必ず &n すなわち変数nのアドレスが返されます。 参考までに http://www9.plala.or.jp/sgwr-t/c/sec10-2.html

ahys
質問者

お礼

回答ありがとうございました。 読解力の不足のせいか、いまいち仰られていることが理解できませんでした。 申し訳ありません。

関連するQ&A

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • C言語について

    「条件演算子(a?b:c)を使って、三つの整数値を読み込んで、その最小値を求めて表示するプログラムを作成せよ」という問題を初心者なりに自分で以下のように解いてみたのですが、もっと簡単に表示できるプログラムがあれば教えてください。 #include<stdio.h> int main(void) { int na,nb,nc,min; printf("整数1:"); scanf("%d",&na); printf("整数2:"); scanf("%d",&nb); printf("整数3:"); scanf("%d",&nc); (na<nb)?min=na:min=nb; printf("最小値は%dです。\n",(nc<min)?min=nc:min); return 0; }

  • C言語の初心者です。

    ポインタについて教えてください。 #include <stdio.h> int main() { int *p,a[2],i=0; p=a; scanf("%d",p); printf("%d\n",*p); i++; scanf("%d",p+i); printf("%d\n",*(p+i)); return 0; } これは整数を入力して出力といった簡単なプログラムなのですが、こういうポインタの使いかたって普通はしないでしょうか・・?。ポインタは使わずにこういう場合は2次元配列とかで出すのが普通なのでしょうか? また、下のプログラムなのですが、上記のプログラムをただ単にキャラ型で試しただけなのですが、どうして実行時エラーがおこってしまうのでしょうか? printfのところの*nameの、*を抜くと実行時エラーはおこりません。しかし、上記の整数では*はつけたままでも エラーしません。 整数とキャラ型では何かちがうのでしょうか?? #include <stdio.h> int main() { char *name,a[10]; name=a; printf("入力---"); gets(name); printf("%s\n",*name); return 0; } 初心者特有の質問をしてしまって申しわけございません。でも、ずっと悩んでて、すこしずつでもポインタの本当の使いかたを知りたいとおもいまして、初期段階ではありますがどうしても解らなかったので質問させていただきました。 そういうものだから!以外でご説明いただける方がいらっしゃいましたら宜しくお願いいたします。

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • C言語の演習2

    何度も似たような質問を出していますがよろしくお願いします。。。 問題は 2つの整数を入力してください。 整数A:54 整数B:84 Aの値はBの64.285714%です。 というものです。あっているか確認お願いします。 #include<stdio.h> int main(void) { int vx, vy; puts("2つの整数を入力してください。"); printf("整数A"); scanf("%lf",&vx"); printf("整数B"); scanf("%lf",&vy"); printf("Aの値はbの%f%です。/n",(double)(vx/vy)); return 0; } であっていますか??お願いします。

  • c言語超初心者です。教えてください

    基本的だと思いますが教えてください。 #include <stdio.h> int main(void) { int na, nb: puts("二つの整数を入力してください."); printf("整数A:”); scanf("%d",&na); printf("整数B:”); scanf("%d",&nb); printf("それらの平均は%fです。\n,(na+nb)/2.0); return(0); } これでintの形で最後のprintfが%fなのですがintは%dとなるはずなのですがこれは2。0という実数値で割るから答えは実数値になりますよ。という意味で%fとしたのでしょうか?確かにこうしないと正しい値がでてこないのです。教えてください。

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

専門家に質問してみよう