gpt4 book ai didi

c - 为什么我的 for 循环会越界?

转载 作者:行者123 更新时间:2023-11-30 20:12:14 26 4
gpt4 key购买 nike

我有一个程序来检查键盘上读到的句子是否是 pangram

但是当显示结果时(在最后一个 for 循环中),它超出了预期范围。如果取消注释 printf声明,你可以看到甚至认为i<26设置为循环条件,则运行到 i = 27大小为 26 的数组有元素 cache[26] = garbage valuecache[27] = 0 。我的最后一个 for 循环出了什么问题?

int main() {
char* string = (char*)malloc(1024*sizeof(char));
fgets(string, 1024, stdin);
int i=0, cache[25]={0};
while(string[i]!='\0' ){
cache[(toupper(string[i])-'A')]++;
i++;
}
for( i=0; i<26; i++){
// printf("%d - %d\n",i,cache[i]);
if(!cache[i]){
printf("not pangram");
return(0);
}
}
printf("pangram");
return 0;
}

最佳答案

问题是你的数组对于 26 个字母来说太小了。它至少应该是cache[26]

那么对于任何非字母字符(逗号、空格等),以下内容可能会超出范围:

cache[(toupper(string[i])-'A')]++;

超出范围会破坏你的内存(例如覆盖 i 或行为未定义时可能发生的任何其他情况)。

如何解决问题?

您可以考虑保护您的缓存增量:

 if (isalpha(string[i]))
cache[(toupper(string[i])-'A')]++;

请注意,一些更奇特的语言环境可能会将“A”-“Z”范围之外的某些字符视为 alpha。所以你甚至可能想要更严格:

 int letter=toupper(string[i])-'A'; 
if (letter>=0 && letter<26)
cache[(toupper(string[i])-'A')]++;

关于c - 为什么我的 for 循环会越界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36678427/

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