1

我正在制作一个反转字符串并检查字符串是否为回文的函数。当我用像“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

4

4 回答 4

1

在这个循环中

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]);       
    }

i当变量的初始值等于时,forward[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最好使用 type 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));

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

于 2015-12-04T16:49:01.833 回答
0

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] = '\0'; 

sizeof(forward)/sizeof(forward[0])是 5 这意味着size = 4

forward[0] = 'a'
forward[1] = 'b'
forward[2] = 'b'
forward[3] = 'a'
forward[4] = '\0'
于 2015-12-04T16:42:38.497 回答
0

反转代码在其中一个索引上关闭,i应该从包含size-10包含:

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

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

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

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

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

  • 函数名reverser与函数所做的不一致:打印其参数。

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

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

于 2015-12-04T16:43:53.180 回答
0

我认为“反转”的第一个字符是 '\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);

于 2015-12-04T16:41:55.620 回答