0
void main()
{
 char c;
 clrscr();
 printf("Enter your name:\n");
 scanf("%s", c);
 printf("You entered your name as : \n")
 printf("%s",c);
 getch();
}

output//
Enter Your name:
sandeep
You entered your name as : 
sandeep

この単一の char 変数 'c​​' が char 配列ではない場合に文字列を格納する方法がわかりません??

4

4 に答える 4

4

そうではありません。

cに (のアドレスではなくc)を渡しscanfているため、 に昇格されint、次にポインターとして使用される値になります ("%s" はポインターを介して何らかのメモリに書き込むことを想定しているため)。これにより、未定義の動作が発生します。どうやら にたまたま持っていた値がcに昇格したときに、intすぐに明白な問題を引き起こさずに書き込むことができるアドレスにたまたま出てきたようです。

に渡したときにもほぼ同じことが起こりprintf、アドレスが一致したため、出力は入力と一致しましたが、同じ実行可能ファイルを再度実行したり、コンパイルしたりした場合に、引き続き一致するという保証はありません。別のコンパイラを使用する、別のシステムで実行するなど。

于 2012-07-08T05:43:23.317 に答える
1

違います。それが機能する場合、たまたま 'c' と次の 4 または 7 バイト (アドレス サイズに応じて) にあるランダムな値で、比較的無害なメモリ領域を指して、偶然に機能します。おそらく、十分に実行すると、c 内および c 周辺のジャンクがあまり良性のないメモリ領域を指しているときに、メモリ エラーが生成されるでしょう。

これは、バッファまたは文字の配列で初期化された char* c である必要があります。C は非常に単純な言語です。コンパイル中に警告をスローする必要があります。

于 2012-07-08T05:45:23.163 に答える
0

動作しているように見えても、scanf は文字列を未割り当てのメモリ ロケーションに書き込みます。配列を使用する必要があります。そうしないと、プログラムがいつかクラッシュする可能性があります。

于 2012-07-08T05:41:40.087 に答える
0

scanf のプロトタイプには 2 番目の引数として "..." があるため、コンパイル時エラーは発生しません。これは、型チェックがないことを意味します。実行時エラーが発生するかどうかは運次第です。

于 2012-07-08T06:11:11.077 に答える