2015-12-04 52 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