有人能告诉我为什么这段代码会崩溃吗?如果字符串的长度> 1,则很简单。超过16,再问一个字符串。如果我在if语句中写入control = 1,它会起作用,但如果没有它,它应该工作相同,因为那时控制的值是1,我是对的吗? 泰恩斯(我正在学习)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
int control = 1;
char word[16] ;
printf("Enter a word: ");
while(control == 1)
{
scanf("%s", word);
int len = strlen(word);
printf("Lenght is: %d\n", len);
if (len >= 16)
{
printf("Word lenght to long, enter a new one: ");
}
else
{
control = 0;
}
}
printf("This is the word: %s\n", word );
}
答案 0 :(得分:8)
char word [16]为字符串分配16个字节的存储空间。
然后scanf()将字符串读入该商店。
如果您读入的分配数量超过分配的数量,则在商店结束后内存已损坏。
这就是你崩溃的原因。
答案 1 :(得分:2)
问题在于,如果用户输入的字符超过了您为其分配空间的15个字符,那么计算机将在数组末尾的内存中快速写入所有这些字符。这将导致“未定义的行为”,包括崩溃您的程序。
答案 2 :(得分:1)
正如其他人所说,你的根本问题是你为字符串分配16
个字符,scanf
很乐意让你把这些16
个字符写入内存中不属于你。
请注意C通常允许您对数组执行此操作,并了解标准C字符串的工作方式:您需要 null-terminate 它们,这意味着您将始终需要额外的空间在数组中为空终止字符\0
。
是一种限制scanf
相对于C字符串的方法,使用带有%s
的字段宽度说明符,如下所示:< / p>
char input[17]; // room for 16 characters plus null-terminator
// here scanf will stop after reading 16 characters:
scanf("%16s", input);
使用此代码,您可以安全地使用scanf
以不超过16
个字符填充字符串,scanf
将为您终止字符串。
但正如其他人也指出的那样,scanf
在处理用户输入方面相当差。通常最好使用fgets
并逐个管理输入字符串。