C:回文:不同的strlen值

时间:2015-12-04 16:36:20

标签: c string palindrome strcmp reversing

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

答案 0 :(得分: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的初始值等于size时,

forward [i]是字符串的终止零

尝试以下循环实现

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进行零终止。但是它已经为零终止,因为它在任何函数之外声明,因此具有静态存储持续时间,因此默认情况下它是零初始化。

答案 1 :(得分:0)

我认为&#34;的第一个字母反转&#34;是&#39; \ 0&#39;。

将此行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);

答案 2 :(得分:0)

倒车时($OutputVariable = (Get-Process %processname% | Select-Object WS) | Out-String),您将空字符放在第一个索引中。这就是每次失败的原因。

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'; 为5,表示sizeof(forward)/sizeof(forward[0])

size = 4

答案 3 :(得分:0)

反转代码由其中一个索引关闭,i应从size-1运行到0,包括:

// 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';

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

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

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

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

  • %d不是strlen()返回值的正确格式。投射为(int)strlen(forward)或使用%zu