• ベストアンサー

printfとscanfの違いって・・・

kameDKの回答

  • ベストアンサー
  • kameDK
  • ベストアンサー率22% (17/75)
回答No.1

scanfはaという変数のある「場所」に"%d"の型で格納すると言うものです。 一方printfではaという変数の「中身」を"%d"という型で出力すると言うものです。 つまりaと表記した場合はaの「中身」を指すことになり、&aと表記された場合はaという変数のある「場所」を指すことになります。 詳しく言うと今aという変数が10と言う場所に割り当てられているとします。そして中身には5と言う数値が入っていたとします。 この場合aのある「場所」は10となり、「中身」は5となります。 &aと書いた場合は「場所」を表すことになりますので、scanfには10が渡されて、格納したい「場所」を指定しています。10と言う場所はaに割り当てられているのでaに格納されることになります。 もしscanfでaと書いてしまった場合は、5と言う数値が渡されてしまい、本来10という場所にあるaとは無関係な5と言う場所にある何かに格納されてしまいます。 これでは思ったとおりの結果にはならないはずです。 まとめるとアドレスか、中身かといえます。

x200
質問者

お礼

ありがとうございました。使う範囲内で、&をつけるつけないを区別していましたが、非常に深みがあることがわかりました。

関連するQ&A

  • printf scanf が、反応しません。

    printf scanf が、反応しません。 #include <stdio.h> int main(void) { int num = 0; int sum = 0; printf("テストの点数を入力してください。(0で終了)\n"); do{ scanf("%d", &num); sum += num; }while(num); printf("テストの合計点は%d点です。\n", sum); return 0; } C:\WORK>gcc test1.c C:\WORK>gcc -o test1 test1.c おかしいです。 打開策を教えてください。 ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

  • printf scanf が、反応しません。

    #include <stdio.h> /*構造体struct carの宣言*/ struct Car{ int num; double gas; }; int main(void) { struct Car car1; printf("ナンバーを入力してください。\n"); scanf("%d", &car1.num ); printf("ガソリン量を入力してください。\n" ); scanf("%lf, &car1.gas"); printf("車のナンバーは%d:ガソリン量は%fです。\n", car1.num,car1.gas); return 0; } C:\WORK>gcc test18.c C:\WORK>gcc -o test18 test18.c いつも教えて頂き、誠にありがとうございます。 上記の件。 println scanfが反応しません。 どうすればいいでしょうか? ご回答のほど、宜しくお願い申し上げます。

  • 関数の値(scanf)

    初心者なもので、言葉の使い方を間違っていたら申し訳ありません。いいたいことが伝わればよいのですが…。 scanfに関して疑問に思ったことがあります。経験的なことなので、正しいかわからないです。次の(1)と(2)から(3)のことが正しいか教えてください。 (1) int a; do{ printf("整数を入力してください\n"); }while(scanf("%d",&a) ==0); printf("入力した数は、%dです",a) このとき、「(いかなる整数)+(ENTER)」を入力しても、do~whileのループを抜け出す。 (2)また、上のプログラムで、継続条件式の中身を  … }while(scanf("%d",&a)!=0);  … とすると、「(いかなる整数)+(ENTER)」を入力してもループが抜け出せない。 (3)したがって(1)と(2)から、scanf()は入力するだけで、値を真(1)を返す。

  • scanf関数の戻り値について

    --------------------------------------- #include<stdio.h> int main(void) { int dt; while(scanf("%d",&dt)==1){ if(dt==0){ printf("0は入力しないでください\n"); puts(""); } else if(dt<0){ dt=-dt; printf("入力値の絶対値は「%d」です\n",dt); puts(""); } else{ printf("入力値の絶対値は「%d」です\n",dt); puts(""); } } return 0; } --------------------------------------- 以上のプログラムについて疑問があります。 scanf関数の戻り値が1の間、繰り返すというもので、入力の時に整数入力ですが、あえて実数である1.1を入れたとします。 scanfの戻り値は1で、dtには整数部の1だけ設定されていたので、これでもうまくいくのかと思ったのですが、次の入力はscanfの戻り値が0になっていて出来ませんでした。 何故0になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

  • scanf が無視されます

    例えば下のようなプログラムを実行するとmain関数の scanf が無視 されてしまいますが何故なのでしょうか。コンパイラはLSI C-86試食版です。 ----------------------------- #include <stdio.h> int main ( ) ; void aa ( ) ; int main ( ) { int i ; aa ( ) ; printf ( " input i. \n " ) ; scanf ( " %d ", &i ) ; printf ( " i = %d\n ", i ) ; } void aa ( ) { int x, y ; while ( scanf ( " %d ", &x ) ! = EOF ) { y = x ; printf ( " y= %d\n ", y ) ; } } --------------------------------

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • scanf()で、エラー対応

    scanf()を使用して、入力で例えば「5462fa」数字ではなく文字を入力してしまった場合エラー(無限ループ)になりますが、 これをscanf()を使用したまま再入力を促すことが可能でしょうか?よろしくお願いします。 #include <stdio.h> int main(){   int a , kazu;   for(a=0;a<1;){     printf("値入力せよー>");       scanf ("%d", &kazu);         if( kazu >= 1 && kazu <=100 ){           a = a + 1 ;         }else{           printf("1から100で入力せよ\n");         }   }   printf ("kazu = %d", kazu);   return 0; }

  • scanf関数を用いての標準演算子(*/+-%)の入力方法

    C言語超初心者のものです。 scanf関数を用いての標準演算子(*/+-%)の入力方法について質問があります。 例:17 / 5 = 3 において ”17”、 ”/”、 ”5” を各々キーボードから入力し、”3”の数値をDOS画面?上に表示させるものです。 ”17”、”5”はscanf関数を使いキーボードから入力できるのですが、”/”だけがどうしても標準演算子として認識させることが出来ません。 私は以下のプログラムを組んでいるのですが、 char num3;  ・・・(省略) printf("Please type in a operator: "); scanf("%c",&num3);  ・・・(省略) printf("%d %c %d is %d\n", num1, num3, num2, product); 無理やりコンパイルして、DOS画面?上に表示させても17 / 5=65536となってしまいます。 ”/”をプログラミングの中で認識させて、ディスプレイ上で例式が正常に表示されるようにしたいのですが、どうしても回答が3になりません。 多分1つの標準演算子が入力できれば、他の標準演算子も入力できると考えています。 どうすればキーボードから標準演算子をプログラミングに認識させることが可能になるのでしょうか? どなたか分かる方がいらっしゃいましたら教えて下さい。 また参考になるURLなどがあればそれも教えて下さい。 よろしくお願いします。

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。