gpt4 book ai didi

c - 输出文件 .exe 没有响应并停止在 C 中工作

转载 作者:行者123 更新时间:2023-11-30 21:44:35 27 4
gpt4 key购买 nike

这是一个检查字符串是否回文的简单程序。我在程序中编写了以下代码。

program to check string is palindrome or not

当我编译它时,没有错误,但是当我尝试运行 .exe 文件时,我总是收到以下消息。

.exe is not responding

最佳答案

这里的根本问题是永远无法满足循环退出条件,这会导致无限循环:

(i != j || i != j - 1)

此条件在逻辑上等同于:

!(i == j && i == j - 1)

这显然总是正确的,因此循环无限期地继续下去。循环只需持续 j > i

这里还有一个问题;即dangerous function gets() should never be used.该函数在 C99 中已被弃用,并在 C11 中从语言中完全删除。一种替代方法是使用 fgets() 代替。请注意,此函数保留换行符(如果缓冲区中有空间),因此您需要在获取输入后删除它。此外,如果缓冲区太小,字符可能会留在输入流中。因此,最好声明一个足够大的输入缓冲区以减少出现问题的风险。没有理由不使用容纳 1000 个字符的输入缓冲区,我通常只使用 4096 来处理类似的事情。内存很便宜。

此外,由于输入字符串可能为空,因此发布的代码中存在未定义行为的风险。在本例中,strlen(str) 将为 0,因此在第一次执行循环体时,j 将减至 -1。但是数组访问 str[-1] 超出范围,并导致未定义的行为。

可以通过在第一次递减之前检查 j 是否为正来解决此问题。请注意,size_t 是数组索引的正确类型,因为它是保证能够保存任何数组索引的无符号整数类型。另请注意,strlen() 函数返回 size_t 类型的值,而不是 int

这是已发布代码的修改版本。 size_t 类型用于数组索引。输入字符串的长度存储在j中,只有当它是正值时才会递减;只要输入字符串不是空字符串,就会将 j 设置为空终止符之前的字符的索引。当j大于i并且这些值索引的字符匹配时,循环继续。循环终止后,str[i] 和 str[j] 应该一致;如果不存在,则输入不是回文。

#include <stdio.h>
#include <string.h>

#define BUF_SZ 4096

int main(void)
{
char str[BUF_SZ];

printf("Enter string:\n");
fgets(str, sizeof str, stdin); // Never use gets()
str[strcspn(str, "\r\n")] = '\0'; // remove '\n'

size_t i = 0;
size_t j = strlen(str);
if (j > 0) {
--j;
}

while (i < j && str[i] == str[j]) {
++i;
--j;
}

if (str[i] == str[j]) {
puts("string is palindrome!!");
} else {
puts("string is not palindrome!!");
}

return 0;
}

关于c - 输出文件 .exe 没有响应并停止在 C 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46990593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com