0

私は C に非常に慣れていないので、購入した本で見つけたいくつかの問題を実行しています。このプログラムの何が問題になっていますか?

int main (void)
{
char text[50]='\0';
scanf ("%s", text);

printf("%c", text[49]);
printf("%s", text);

return 0;
}
4

4 に答える 4

8
char text[50]='\0';

有効じゃない。初期化をスキップtextして宣言するだけです

char text[50];

または、最初の要素を初期化できます

char text[50]={'\0'};

のインクルードも欠落しており、呼び出しが文字列を読み取り、文字列の最大長を指定できることをstdio.h実際に確認する必要がありますscanf

if (scanf("%49s", text) == 1)
于 2013-10-11T15:00:12.133 に答える
3

あなたは取り除きたい:

printf("%c", text[49]);

文字列の長さが 49 秒未満の場合、そのメモリ位置に何があるかわかりませんchar

于 2013-10-11T14:58:25.033 に答える
2

C では、シングル クォーテーションとダブル クォーテーションの違いがあります。

  • 二重引用符は文字列を意味します
  • 一重引用符は文字を意味します

行 3 はコンパイルされません。これは、コンパイラが文字列を文字配列に割り当てることを要求しているためです。

できるよ

char text[50]="\0";

実際には、50 バイトすべてがゼロで埋められます。

あなたもできる

char text[50]="bla";

これにより、最初の 3 バイトが「bla」で埋められ、残りがゼロで埋められます。少なくとも私のコンパイラはそうしています。

とにかく次のステートメントだけでユーザー入力を入力するため、何もできません。

char text[50];
scanf ("%s", text);

しかし、問題があります。ユーザーが 49 文字未満の文字列を入力した場合、次のステートメントでランダムな出力が得られるためです。しかし、初期化するとゼロバイトが出力されますが、これもまったく役に立ちません。

ただし、主なポイントは、文字の配列を処理するときの C のさまざまな動作を学ぶことです。

于 2013-10-11T15:19:24.963 に答える