为什么C语言比较字符数组时会出现segmentation fault(段错误)
问题原因分析
核心触发段错误的原因是空指针访问,具体问题出在两处逻辑:
while循环逻辑顺序错误:循环条件判断token != NULL后进入循环,第一行代码就调用strtok(NULL, " ")获取下一个token,strtok遍历完所有分割结果后会返回NULL,后续直接将空指针传入strncmp做字符串比较,触发非法内存访问。- 存在隐性隐患:如果输入的
sentence是空字符串,第一次调用strtok就会返回NULL,第98行的strncmp也会直接触发空指针访问。
修复方案
调整循环执行顺序,每次拿到token先判空,再执行比较逻辑,最后再取下一个token即可,修复后代码如下:
int word_freq(char *sentence, char *word){ int n = 0; int word_len = strlen(word); char *token; printf("chosen word: %s\nword length: %d\n", word, word_len); token = strtok(sentence, " "); // 获取第一个token while (token != NULL) { printf("%s", "x"); // 非空才执行比较,补充token长度判断避免前缀匹配误判 if (strlen(token) == word_len && strncmp(token, word, word_len) == 0) { n++; } token = strtok(NULL, " "); // 比较完再取下一个token } printf("\n"); return n; }
补充说明:原逻辑只比较word长度的字符会出现前缀匹配误判,比如word是app、token是apple也会被计数,修复代码中增加了token长度判断可以实现完整单词匹配。
内容的提问来源于stack exchange,提问作者h4ppyturt1e
相关产品推荐
相关产品推荐

