c - C GOTO 命令创建无限循环
问题描述
#include <stdio.h>
int main(void)
{
char str[10];int i,length=0;
line:
{
printf("Enter string of length 10 \n");
scanf("%[A-Za-z]s", str);
}
for (i=0; str[i] != '\0'; i++)
{
length++;
}
if (length != 10)
{
printf("Length of string is : %d \n Give a string of length 10 please \n", length);
goto line;
}
else
{
printf("length = %d \n", length);
printf("Your String is: %s", str);
}
return 0;
}
如果用户输入一个长度不等于 10 的字符串,那么我的预期输出应该是:打印出“输入字符串 o 长度 10”并等待用户输入另一个字符串,然后检查它的长度。
我已删除 Goto 语句并检查长度不等于 10 的字符串,它确实计算长度并输出它,如下所示:
Enter string of length 10
dciciibiyciyigiy
Length of string is : 16
Give a string of length 10 please.
*** stack smashing detected ***: ./palindrome.out terminated
Aborted (core dumped)
我在其他一些代码中执行了类似的 Goto 命令,但是对于这个:如果我尝试输入一个长度不等于 10 的字符串,它会显示长度,然后进入无限循环 o 打印类似这样的内容:
...
Length of string is : 428115
Give a string of length 10 please.
Enter string of length 10
Length of string is : 428130
Give a string of length 10 please.
Enter string of length 10
Length of string is : 428145
Give a string of length 10 please.
...
等等。我不明白我做错了什么?
解决方案
您没有正确限制用户可以输入的字符数。
该数组str
可以容纳 10 个字节,但调用scanf
不会限制用户输入更多字符。因此,如果输入的字符过多,则可能会超出数组的末尾。这会调用未定义的行为,在这种情况下会导致代码崩溃。
您需要将格式说明符更改为scanf
最多允许 9 个字符(因为您需要为空终止字符保存 1 个字节):
scanf("%9[A-Za-z]", str);
然后,您可以摆脱长度检查(以及相关的goto
),因为无法再输入 10 或更长的字符串。
如果您希望用户最多可以输入 10 个字符,则需要将大小str
增加到 11。
推荐阅读
- c++ - 向量排序算法,只对大于 0 的元素进行排序
- android - Android SQLite 在删除行后更新所有 id
- javascript - 如何在 Angular 中为自定义验证器添加自定义验证错误消息
- google-calendar-api - 启用“sendNotifications”时“quotaExceeded:超出日历使用限制”
- laravel - 当我从我在 Laravel 中构建的网站联系表单发送消息时,消息显示为我发送的
- javascript - 打字稿不首先使用 D3 csv 加载数据
- java - 有没有办法静态分析 plugin.xml 的引用
- sql - 从表中查找缺失值
- android - 如何获取最后插入的事件的 id
- spi - 是否可以在我的计算机上使用 SPI 从 SD 卡获取数据?