首页 > 解决方案 > 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. 
...

等等。我不明白我做错了什么?

标签: cgoto

解决方案


您没有正确限制用户可以输入的字符数。

该数组str可以容纳 10 个字节,但调用scanf不会限制用户输入更多字符。因此,如果输入的字符过多,则可能会超出数组的末尾。这会调用未定义的行为,在这种情况下会导致代码崩溃。

您需要将格式说明符更改为scanf最多允许 9 个字符(因为您需要为空终止字符保存 1 个字节):

scanf("%9[A-Za-z]", str);

然后,您可以摆脱长度检查(以及相关的goto),因为无法再输入 10 或更长的字符串。

如果您希望用户最多可以输入 10 个字符,则需要将大小str增加到 11。


推荐阅读