c语言中不使用';行不通

c语言中不使用';行不通,c,if-statement,C,If Statement,有人能告诉我为什么这个代码会崩溃吗?很简单,如果字符串长度>16,请再次请求字符串。如果我在if语句中写入control=1,它就可以工作,但是如果没有它,它也应该工作,因为此时control的值是1,对吗? thans(我正在学习) #包括 #包括 #包括 int 主(空) { int控制=1; 字符字[16]; printf(“输入一个单词:”); while(control==1) { scanf(“%s”,单词); int len=strlen(字); printf(“长度为:%d\n”

有人能告诉我为什么这个代码会崩溃吗?很简单,如果字符串长度>16,请再次请求字符串。如果我在if语句中写入control=1,它就可以工作,但是如果没有它,它也应该工作,因为此时control的值是1,对吗? thans(我正在学习)

#包括
#包括
#包括
int
主(空)
{
int控制=1;
字符字[16];
printf(“输入一个单词:”);
while(control==1)
{
scanf(“%s”,单词);
int len=strlen(字);
printf(“长度为:%d\n”,len);
如果(len>=16)
{
printf(“单词长度变长,输入一个新单词:”);
}
其他的
{
控制=0;
}
}
printf(“这是单词:%s\n”,单词);
}

字符字[16]为字符串分配16字节的存储空间

然后,scanf()将一个字符串读入该存储

如果读入的内容超过分配的存储量,则存储结束后内存将损坏


这就是崩溃的原因。

char-word[16]为字符串分配16字节的存储空间

然后,scanf()将一个字符串读入该存储

如果读入的内容超过分配的存储量,则存储结束后内存将损坏


这就是你崩溃的原因。

问题是,如果用户键入的字符超过了你分配空间的15个字符,那么计算机将愉快地将它们全部写入内存,超过数组的末尾。这将导致“未定义的行为”,包括程序崩溃。

问题是,如果用户键入的字符超过您分配空间的15个字符,那么计算机将愉快地将它们全部写入内存,超过数组的末尾。这将导致“未定义的行为”,包括程序崩溃。

正如其他人所指出的,您的根本问题是您正在为字符串分配
16
字符,而
scanf
将允许您将这些
16
字符写入不属于您的内存

请注意,C通常允许您对数组执行此操作,并了解标准C字符串的工作原理:您需要以null结尾,这意味着您将始终需要在数组中为null结尾字符留出额外的空间
\0

有一种方法可以限制C字符串的
scanf
,使用
%s
的字段宽度说明符,如下所示:

char input[17];  // room for 16 characters plus null-terminator

// here scanf will stop after reading 16 characters:
scanf("%16s", input);
使用此代码,您可以安全地使用
scanf
将字符串填充为不超过
16
个字符,并且
scanf
将为您以null终止字符串


但正如其他人也指出的那样,
scanf
在处理用户输入方面非常差。通常最好使用
fgets
并自己一块一块地管理输入字符串。

正如其他人所指出的,您的根本问题是为字符串分配
16个
字符,而且
scanf
将允许您将那些
16
字符写入不属于您的内存

请注意,C通常允许您对数组执行此操作,并了解标准C字符串的工作原理:您需要以null结尾,这意味着您将始终需要在数组中为null结尾字符留出额外的空间
\0

有一种方法可以限制C字符串的
scanf
,使用
%s
的字段宽度说明符,如下所示:

char input[17];  // room for 16 characters plus null-terminator

// here scanf will stop after reading 16 characters:
scanf("%16s", input);
使用此代码,您可以安全地使用
scanf
将字符串填充为不超过
16
个字符,并且
scanf
将为您以null终止字符串


但正如其他人也指出的那样,
scanf
在处理用户输入方面非常差。通常最好使用
fgets
并自己一块一块地管理输入字符串。

还请记住,终止的空字符算作已分配的16个字符之一。当然,希望这样做只算作最佳答案,比如说10分,而不是每次递增投票10分。如果我写一个无锁问题的答案,这需要多年的经验,我可能会得到一两张选票,因为还有谁知道呢?我写了一篇关于C的简单说教题,嘿,八票。这是啤酒椒盐卷饼投票。它实际上并没有反映出对收件人来说是一个很好的因素。也考虑到更深奥的问答,因为观众少,所以投票少。还记得终止的空字符是被分配的16个字符中的一个。当然,希望只算出最好的答案,比如说10分,而不是每次投10分。如果我写一个无锁问题的答案,这需要多年的经验,我可能会得到一两张选票,因为还有谁知道呢?我写了一篇关于C的简单说教题,嘿,八票。这是啤酒椒盐卷饼投票。事实上,这并不仅仅是对收件人感觉良好的因素。也考虑到更深奥的问答,因为观众少,选票少。