3

次のプログラムを参照してください。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

main(void){
  printf("Array concatenateor\n-------------------------\n");

  //declarations
  char s1[50],s2[50],s3[50];
  short int n=0;

  //Array initialisation
  printf("Array 1: ");
  gets(s1);
  printf("Array 2: ");
  gets(s2);

  strcpy(s3, s1); //asure initial form of s1 in s3
  strcat(s1, s2); //concatenate s1 with s2  
  //at this point s1 is in the concatenation form and s3 is s1's initial form

  printf("Arrays concatenated with STRCPY: \"%s\"\n", s1); //print concatenation, s3 ok
  printf("Number of characters to concatenate: "); //scan number, s3 ok
  scanf("%d",&n); //beyond this point s3 becomes null... peculiar
  printf("S3: %s\n",s3);    //this is the proof of s3 being null
  strncat(s3,s2,n); //s3 concatenates with n chars of s2
  printf("Arrays concatenated with STRNCAT(%d chars): %s\n", n, s3);  //print s3
  system("PAUSE");
  return 0;
}

その特定の scanf が暗示されることなく s3 配列を消去する方法は独特です。なぜこれが起こるのですか?

4

2 に答える 2

4

スキャン ラインを次のように変更します。

scanf("%hd",&n);

ここを参照してください: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

于 2011-07-22T19:49:20.730 に答える
4

「n」を「short int」ではなく「int」にして実行し、修正されるかどうかを確認してください。もしそうなら、その理由を説明します。

Soren が指摘するように、scanf は 32 ビットのデータを読み込むことを想定しています。バッファーが 16 ビット幅しかない場合、余分なメモリは属していない場所にシャッフルされ、基本的にメモリがゼロになります (ユーザーが十分に小さい数値を入力した場合)。

于 2011-07-22T19:43:38.143 に答える