2015-12-04 27 views
1

我正在制作一个函数,它可以反转字符串并检查字符串是否是回文。当我用“abba”等明显的回文测试函数时,函数表示它不是回文。前向串和反向串的串长也不同!C:回文:不同的strlen值

#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

+0

请正确缩进您的代码,我无法理解它。 –

+0

'int i = size' - >'int i = size-1' – BLUEPIXY

+0

这是什么?为什么不在strlen()这里? int size =(sizeof(forward)/ sizeof(forward [0]) - 1); –

回答

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]是终止字符串的零当可变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]);  
    } 

也考虑到var将存储由运营商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

还要注意'reverse'不是空终止的 – chqrlie

+0

@chqrlie你为什么决定如此? –

+0

因为即使它不是绝对必要的,因为'reverse'是一个全局变量,操作只发生一次,我相信OP不是意识到他的代码不能以更一般的方式使用。 – chqrlie

0

我认为的 “反转” 的第一个字符是 '\ 0'。

int size = strlen(forward)替换这条线int size = (sizeof(forward)/sizeof(forward[0]) - 1);

此外:

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

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

有在你的代码中的许多其他问题:

  • forwardsize是全局变量,但你也命名在功能reverser相同的方式论证,并使用全球size存在,这可能是不适当的,如果叫用不同的参数。 size更糟的j不应该是全局变量

  • 函数名reverser与功能做什么不一致的(!):打印其参数。

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

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

+0

您应该通过删除'j ++'和'--i '从这些括号中将它们放在for循环中的适当位置 – smac89

+0

@ Smac89:我真的把它们放在那里,下行循环不应该使用'> = 0',因为这个测试对于无符号变量是不合适的。在测试表达式中使用或降低后的索引是惯用的,虽然对于初学者来说是混淆的。建议的替代方案更简单并且更不容易出错 – chqrlie