C:回文:不同的strlen值

C: Palindrome: Different strlen-values

我正在制作一个函数来反转字符串并检查该字符串是否为回文。当我用像 "abba" 这样明显的回文来测试函数时,函数说它不是回文。此外,正向字符串和反向字符串的字符串长度也不同!

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

char forward [] = "abba"; //The string to be reversed

int size = (sizeof(forward)/sizeof(forward[0]) - 1);
int j = 0;
char reverse [10];

void reverser(char forward []) {

    printf("%s", "String forward: ");
    for (int i = 0; i < size; i++) { //Function for printing out the forward string.
        printf("%c", forward[i]);
    }

    printf("\n");

    printf("%s", "String reversed: ");

    for (int i = size, j = 0; i >= 0; --i, ++j) { //Function for reversing the string and printing it.
        reverse[j] = forward[i];
        printf("%c", reverse[j]);       
    }

    printf("\n");

    if (strcmp(forward, reverse) != 0) { //Using strcmp to check if the forward and reversed string are the same. 
        printf("Not a palindrome!\n");
    }
    else{
        printf("A palindrome!\n");
    }

    printf("Forward string length: %d\n",strlen(forward));
    printf("Reversed string length: %d\n",strlen(reverse));
} 

int main () {
    reverser(forward);      
}

输出:
字符串向前:abba
字符串反转:abba
不是回文!
正向字符串长度:9
反转字符串长度:0

我认为 "reversed" 的第一个字符是 '\0'。

将这一行 int size = (sizeof(forward)/sizeof(forward[0]) - 1); 替换为 int size = strlen(forward)

此外:

printf("%s", "String forward: "); for (int i = 0; i < size; i++) { //Function for printing out the forward string. printf("%c", forward[i]); }

可以替换为printf("String forward : %s\n", forward);

您在反转时将空字符放在第一个索引中 (reverse[0])。这就是为什么每次都失败。

for (int i = size, j = 0; i >= 0; --i, ++j) {         
    reverse[j] = forward[i];
}

应该是

for (int i = size - 1, j = 0; i >= 0; --i, ++j) {
    reverse[j] = forward[i];
}
reverse[size] = '[=11=]'; 

sizeof(forward)/sizeof(forward[0]) 是 5 即 size = 4.

forward[0] = 'a'
forward[1] = 'b'
forward[2] = 'b'
forward[3] = 'a'
forward[4] = '[=12=]'

反向代码在其中一个指数上偏离了一个,i应该运行从size-10包括:

// Function for reversing the string.
for (int i = size, j = 0; i > 0;) {
    reverse[j++] = forward[--i];
}
reverse[size] = '[=10=]';

为避免更新 2 个不同的索引,您可以简化此循环:

// Function for reversing the string.
for (int i = 0; i < size; i++) {
    reverse[i] = forward[size - 1 - i];
}
reverse[size] = '[=11=]';

您的代码中还有许多其他问题:

  • forwardsize 是全局变量,但您也以相同的方式命名函数 reverser 中的参数并使用全局变量 size在那里,如果用不同的参数调用,这可能是不合适的。 size 更糟的是 j 不应该是全局变量 (!)

  • 函数名称reverser与函数的作用不一致:打印其参数。

  • 你可以直接用%s printf 格式打印参数字符串。不需要循环。

  • %d 不是 strlen() return 值的正确格式。转换为 (int)strlen(forward) 或使用 %zu.

在这个循环中

for (int i = size, j = 0; i >= 0; --i, ++j) { //Function for reversing the string and printing it.
    reverse[j] = forward[i];
    printf("%c", reverse[j]);       
    }

forward[i]是当变量i的初始值等于size

时字符串的终止零

尝试以下循环实现

for ( int i = size, j = 0; i != 0; ++j) { //Function for reversing the string and printing it.
    reverse[j] = forward[--i];
    printf("%c", reverse[j]);       
    }

还要考虑到,对于将存储由运算符 sizeof 或函数 strlen 返回的值的变量,最好使用类型 size_t.

所以在这些陈述中

printf("Forward string length: %d\n",strlen(forward));
printf("Reversed string length: %d\n",strlen(reverse));

使用格式说明符 %zu 而不是 %d

例如

printf("Forward string length: %zu\n",strlen(forward));
printf("Reversed string length: %zu\n",strlen(reverse));

这里的一些回答者说你必须以零结束字符串 reverse。然而,它已经是零终止的,因为它是在任何函数之外声明的,因此它具有静态存储持续时间,因此默认情况下它是零初始化的。