2016-02-13 22 views
-3

我還是一個初學者編碼器,我在編寫程序時遇到了麻煩,要檢查一個字符串是否是迴文,只使用<stdio.h><stdlib.h>庫。迴文的C程序

該字符串最多可以佔用30個字符。我們必須假定字符串可以帶有數字,標點符號和字母。另外,假設字符串中沒有空格。必須區分大小寫字符。所以「夫人」將是一個迴文,但「MaDam」不會是迴文。該字符串以空終止符結束。 嗨,所以當我用gcc -Wall編譯時。我得到這些錯誤。有人可以解釋我如何解決這些錯誤?感謝您的時間。

s_palindrome.c:24:15: warning: variable 'length' is used uninitialized whenever 
    'for' loop exits because its condition is false 
    [-Wsometimes-uninitialized] 
for (a=0; **a<30**; a++){ 

is_palindrome.c:36:18: note: uninitialized use occurs here 
for (a=0; **a<(length/2)**; a++){ 

is_palindrome.c:24:15: note: remove the condition if it is always true 
for (a=0; **a<30**; a++){ 

is_palindrome.c:12:18: note: initialize the variable 'length' to silence this 
    warning 
**int a, length;**= 0 

代碼

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
char string [30]; 
int a, l; 
int p=1; 

printf("Enter a string to test: \n"); 
scanf("%s", string); 

for (a=0; a<30; a++){ 
    if (string[a]=='\0'){ 
     l=a; 
     break; 
    } 
} 

for (a=0; a<l/2; a++){ 
    if (string[a]!=string[l-1-a]){ 
     p=0; 
    } 
} 

if (p){ 
    printf("%s is a palindrome\n", string); 
} 
else { 
    printf("%s is not a palindrome\n", string); 
} 

return 0; 
} 
+3

您已經顯示了一些代碼,但沒有提及它。它工作嗎?如果不是,它的行爲是什麼?那就是,你爲什麼要問一個非常普遍的問題,而不是將它與你寫的代碼聯繫起來? – kaylum

+1

在您發佈的代碼中有幾處語法和邏輯錯誤。 –

+0

由於緊密原因不再適用,我不情願投票重新開放。請注意,你的問題的答案是在警告本身:'注意:初始化變量的'長度'來消除這個警告' –

回答

-3

下面的代碼

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
char str[30]; 
int i, len=0; 
int flag=1; 
printf("Enter a string: \n"); 
scanf("%s", &str); 

for (i=0; str[i]!='\0'; i++){ 
len++; 
} 
len--; 

for(i=0;i<=len/2;i++) 
    if(str[i]!=str[len-i]) 
    { 
     flag=0; 
     break; 
    } 

if(flag==1) 
    printf("%s is a palindrome. \n", str); 
return 0; 
} 
+0

你好,你能解釋一下什麼標誌的意思嗎? – user44775

+3

你不應該只是給代碼。您需要提供OP在代碼中存在的問題的解釋,然後提供帶註釋的代碼示例。你的回答既沒有這些東西 – Levi

+0

@ user44775'flag'這裏只是用來作爲一個指標,它記錄了循環是否沒有完成它的迭代,並且不得不在它們之間「斷開」,這意味着它的初始值爲1 '表示輸入是一個迴文(循環完全運行),相反,'0'值表示輸入不是迴文(循環中斷),這是@Abhay錯過的檢查。 –

0

有許多的問題,其中大部分防止程序編譯。

  • 您定義了string,但在其他地方使用str。因此請將定義更改爲str
  • printf("%s is not a palindrome!"\n);:換行符在字符串之外,並且您沒有通過str作爲參數來打印它。
  • printf("%s is a palindrome. \n");:同樣,str不通過在打印
  • for (first=0, first=e; str[first]!='\0',first>=0, first++, last--){
    • 有兩個部分,而不是所要求的3,即一個;缺失。它應該在first++之前。
    • 你不能逗號分開的條件部分。您必須使用一些邏輯連接器,如||&&。但是,在這種情況下,只需要第一部分,因此您可以刪除第二部分。
    • 您不初始化lastfirst=e應該是last=e;
    • 結果定影上述的:for (first=0, last=e; str[first]!='\0'; first++, last--){
  • 缺少}只是return在結束之前。
  • 沒有錯誤,但if(str[first]==temp[first]) continue;可以被刪除,因爲您無論如何都處於循環底部。
0
int valid=1;//is palindrome 
for(i=0, j=e; i<j; ++i, --j) { 
    if(str[i] != str[j]){ 
     valid=0; 
     break; 
    } 
} 

這是否幫助?它看起來像你得太多這個問題

2

這裏是你的代碼,我已經測試工作的修正版本:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char str[30], temp[30]; 
    int first, last, e; 
    printf("Enter a string: "); 
    scanf("%s", str); 

    for (first=0; str[first]!='\0'; first++) 
    { 
    e = first; 
    } 
    // loop finds the length of the string, e=first is the index of the last character of the string 

    // code to store reverse of str in temp 
    for (first = 0, last = e; str[first] != '\0'; first++, last--) 
    { 
    temp[first] = str[last]; 
    } 
    temp[first] = '\0'; 

    // code to compare str and reverse of str i.e. temp 
    for (first=0; str[first]!='\0'; first++) 
    { 
     // if any character in str and reverse str i.e. temp is unequal, break the loop 
     if(str[first]!=temp[first]) 
     { 
     printf("%s is not a palindrome!\n",str); 
     break; 
     } 
    } 

    // if loop did not break str and reverse str i.e. temp are equal 
    if(str[first]=='\0') 
    { 
    printf("%s is a palindrome.\n",str); 
    } 
    return 0; 
} 

存在一些問題,如:

  • char string[30];宣佈但使用str

  • e=first將不等於字符串的長度,而是比它小1,這使得它成爲字符串的最後一個字符的索引。

  • 這個efor (first=0, first=e; str[first]!='\0',first>=0, first++, last--)中被錯誤地使用了,其中first被初始化了兩次,使它失去了初始值。相反,last應該已經初始化爲e。此外,for循環可以有多個初始化以及增量/減量(用逗號分隔),但不是多個條件。初始化,條件和增量/減量之間的分隔符應該是分號;,在您的情況下缺失。

  • 有沒有必要在循環結束的continue;語句,因爲continue不像break,用來阻止繼續執行當前迭代,並移動到下一個迭代。因爲在這裏你沒有更多的代碼可以在當前迭代中執行,所以continue是多餘的,不需要。

  • printf函數被錯誤使用。在此函數中,您必須提供一個格式說明符作爲第一個輸入,它是輸出將如何呈現的格式。所有包含在最終輸出中的變量的換行符「\ n」,空格和佔位符應在此處指定。其餘參數printf將包含所有變量,其中佔位符以格式定義作爲第一個參數傳入的說明符字符串。

  • 支柱}在最後的if時失蹤。

  • 我已更正您發佈的相同基本算法,但效率並不高。更有效的算法可以避免創建另一個反向數組。相反,它會開始比較同一個字符串中第一個和最後一個索引的字符,在每個步驟中先遞增並遞減,直到達到中間字符。