27

次のコードがあります。

char *s1, *s2;
char str[10];

printf("Type a string: ");
scanf("%s", str);

s1 = &str[0];
s2 = &str[2];

printf("%s\n", s1);
printf("%s\n", s2);

コードを実行すると、次のように「A 1」と入力します。

Type a string: A 1

次の結果が得られました。

A
�<�

最初の文字を文字列として、3 番目の文字を整数として読み取り、それらを画面に出力しようとしています。最初の文字は常に機能しますが、その後、画面にランダムなものが表示されます....どうすれば修正できますか?

4

3 に答える 3

38

あなたは正しい方向に進んでいます。修正されたバージョンは次のとおりです。

char str[10];
int n;

printf("type a string: ");
scanf("%s %d", str, &n);

printf("%s\n", str);
printf("%d\n", n);

変更点について話しましょう。

  1. n番号を格納するint()を割り当てます
  2. scanf最初に文字列を読み、次に数字を読むように指示します(%dあなたがすでに知っているように、数字を意味しますprintf

それがほとんどすべてです。strそれでも、9文字を超えるユーザー入力はオーバーフローしてスタックを踏みにじり始めるため、コードは少し危険です。

于 2012-07-31T02:50:08.563 に答える
5

scanf("%s",str)空白文字が見つかるまでのみスキャンします。入力"A 1"を使用すると、最初の文字のみがスキャンされます。したがって、その配列が初期化されていないため、s2たまたまにあったガベージをポイントします。str

于 2012-07-31T02:51:04.403 に答える
2

このコードを試してみてください...

#include<stdio.h>
int main(){
   char *s1, *s2;
   char str[10];

   printf("type a string: ");
   scanf("%s", str);

   s1 = &str[0];
   s2 = &str[2];

   printf("%c\n", *s1);   //use %c instead of %s and *s1 which is the content of position 1
   printf("%c\n", *s2);   //use %c instead of %s and *s3 which is the content of position 1

   return 0;
}
于 2014-06-07T08:17:05.337 に答える