在c中与字符串作斗争 - 问题将是空终止符

问题描述 投票:0回答:1

我不明白我的代码中如何存在未初始化的变量访问和堆栈缓冲区溢出,即使调试时两个字符串相同。当我向 str2 添加空终止符时,它也无法解决问题。当我使用 fgets 时,空终止符问题仍然存在。我该如何解决这个问题?有人可以解释为什么会发生这种情况以及在解决类似问题时要寻找什么吗?

注意:代码正在检查字符串是否是回文

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

#define MAX 4096

int main(void) {
    // Handle taking in input
    char str[MAX];
    int len = 0;
    while (scanf("%c", &str[len]) != EOF) {
        len++;
    }
    char str_rev[MAX];
    int j = 0;
    for (int i = len-1; i >= 0; i--) {
        str_rev[j] = str[i];
        j++;
    }
    
    if (strcmp(str, str_rev) == 0) {
        printf("String is a palindrome\n");
    } else {
        printf("String is not a palindrome\n");
    }

    return 0;
}

错误:堆栈缓冲区溢出。

Values when execution stopped:

j = 7
len = 7
str = "racecar", <4089 uninitialized values>
str_rev = "racecar", <4089 uninitialized values>
str_rev[j] = <uninitialized value>
c string null strcmp null-terminated
1个回答
0
投票

要使用

strcmp
,两个数组都必须是 C 字符串。所以,两者最后都必须有零终止符。

你必须添加

str[len] = 0;
str_rev[len] = 0;

在致电

strcmp
之前。

完整示例:https://godbolt.org/z/GGKKdPoPc

© www.soinside.com 2019 - 2024. All rights reserved.