c# C代码似乎随机停止运行,没有任何解释[已关闭]

oprakyz7  于 2023-02-10  发布在  C#
关注(0)|答案(1)|浏览(215)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2小时前关门了。
Improve this question
程序永远不会到达printf()函数,但如果printError()函数应该被调用,它就会被调用。我已经在这个问题上停留了一段时间,希望得到任何帮助。
我试着替换代码并向代码中添加不同的printf()函数(编译器没有调试器)
在下面的代码中,我的C代码似乎在for循环之后停止运行:

char *output;
    int pairs[676], len, most[2];
    scanf("%d", &len);
    char chr[2];
    char *input = (char *)malloc((1 + len) * (sizeof(char)));
    for (int i = -1; i < len; ++i) {
        scanf("%c", (input + i));
        if ((*(input + i) < 97 || *(input + i) > 122) && *(input + i) != ' ') {
            printError();
            valid = false;
        }
    }
    printf("%d, valid);
qybjjes1

qybjjes11#

代码中存在多个问题:

    • *[major]**第一个scanf()调用将导致未定义的行为,因为它将尝试在分配的数组开始之前将char值存储到input[-1]中。
    • *[minor]**您应该测试scanf()的返回值,以检测无效或丢失的输入。您还应该测试len > 0,并检查内存分配是否失败。
    • *[次要]**您应该使用可读性更强的语法input[i],而不是*(input + i)
    • *[次要]**硬编码ASCII字符值97122容易混淆。最好使用'a''z'
    • *[major]**printf("%d, valid);中缺少"代码无法编译。
    • *[minor]**scanf("%c", (input + i));读取的第一个字符是用户在长度之后输入的字符。它可能是换行符,导致printError()被调用。
    • *[major]**必须在字符串末尾使用input[len] = '\0';设置空终止符

相关问题