2
  char *str;
  printf("Enter string:\n");
  scanf("%s",str);

输出:运行时检查失败#3 str 正在使用而未初始化

4

5 回答 5

3

分配一个数组并读入:

char str[100];

if (scanf("%99s", str) != 1)
    ...error...

或者,如果你需要一个指针,那么:

char data[100];
char *str = data;

if (scanf("%99s", str) != 1)
    ...error...

注意使用长度来防止缓冲区溢出。请注意,指定给scanf()et al 的长度比总长度小 1(基于古代先例的奇怪现象;大多数代码都包含指定长度的空字节 -fgets()例如,请参阅 )。

请记住,这%s将跳过前导空格,然后在某个非空格字符之后的第一个空格处停止。特别是,它将在输入流中保留换行符,为下一个输入操作读取做好准备。如果您想要整行输入,那么您可能应该使用fgets()andsscanf()而不是 raw scanf()- 事实上,您经常应该使用fgets()andsscanf()而不是scanf()or fscanf(),如果只是因为它使合理的错误报告容易。

于 2013-09-28T16:42:25.523 回答
1

如果你不初始化它,它是一个未定义的行为。你有一个未初始化的指针,它正在将数据读入内存位置,这最终可能会给你带来麻烦。你已经声明str为一个指针,但你没有给它一个有效的指向位置;它最初包含一些可能是也可能不是可写内存地址的随机值。尝试将内存分配给 char *str;

char *str = malloc(sizeof(char)*100);
于 2013-09-28T16:28:23.293 回答
0

char *str声明strchar类型的指针。scanf("%s",str)将只E从输入的字符串中读取。

于 2013-09-28T16:28:47.240 回答
0

您可能不想完全使用scanf("%s")(或养成使用它的习惯),因为它容易受到缓冲区溢出的影响(即,可能接受的字符数可能超出缓冲区的容量)。有关此问题的讨论,请参见Scanf 的缺点

于 2013-09-28T16:39:20.570 回答
0

在为指针分配一些值之前,您必须分配内存。永远记住,指针指向一个内存位置,你必须告诉他你想为他分配的内存位置。因此,为此,您必须这样做:

str = (char*)malloc(sizeof(char));

这将为您分配 1 个字节的内存块。因此,您只能在此内存块中分配一个字符。对于字符串,您必须根据字符串中的字符数分配尽可能多的块。例如,“堆栈”需要 5 个字符和 1 个额外的块用于 '\0'。因此,您必须为他分配至少 6 个内存块。

str =  (char*)malloc(6*sizeof(char));

我希望这将帮助您在 C 中发展更多概念。

于 2013-09-28T16:46:08.007 回答