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

尝试使“n”成为“int”而不是“short int”,运行它,看看是否可以修复它。如果是这样,我会解释原因。

正如 Soren 所指出的,scanf 期望读取 32 位数据;当缓冲区只有 16 位宽时,额外的内存会被打乱到它不属于的地方,基本上将内存归零(假设用户输入的数字足够小)。

于 2011-07-22T19:43:38.143 回答
4

将您的扫描线更改为:

scanf("%hd",&n);

见这里:http ://www.cplusplus.com/reference/clibrary/cstdio/scanf/

于 2011-07-22T19:49:20.730 回答