2015-07-19 99 views
0

我所做的是要求用戶輸入程序循環的次數,然後將值記錄到3個不同的數組中。一切都很好,但我需要做的是打印一個數組的元素,如果另一個數組中的相應元素滿足要求。其他一切都運行良好,我會發布我正在嘗試使用的兩個數組。輸入循環問題

char *names[50][32]; 
char *states[50][2]; 
    i = 0; 
while (i < b) { 
    if (state[i] = "tx");{ 
     printf("a string %s\n", names[i]);} 
     i = i + 1; 
    } 

此:if (state[i] = "tx");{我基本上試着用和不用引號和使用116120 ...

,它要求人們的名字和他們居住的地方。我可以得到它打印每個名稱的數組元素值(它運行在一個循環中),但我希望它只打印生活在TX中的人的名字。

+2

提示:什麼是',''中如果(狀態[i] = 「TX」); {'怎麼辦? –

+0

此代碼不能編譯。沒有聲明'狀態'。 –

+0

另外'='運算符是賦值而不是比較 –

回答

3

你的代碼有幾個錯誤。首先用分號結尾的iffor結構是在C中啓動時常見的錯誤。基本上它會創建一個空的if語句,後面跟着一個代碼塊。看看這樣說:

if (condition) 
    ; // Does nothing. The if is empty 

// Totally unrelated block of code. 
{ 
} 

代碼塊通常是創建範圍,所以雖然它似乎沒有用編譯器以這種方式解讀塊有用的,但實際上並非如此。這也發生在其他情況下,如whilefor,等等:

for (int i=0 ; i<n ; ++i) 
    ; // Empty for. Runs `n` loops, but doing nothing 

// Unrelated block of code. Runs only once 
{ 
} 

的比較操作也是錯誤的,你應該使用==的比較,而不是=,其中用於分配。

最後,你不能以這種方式比較字符串。字符串基本上是數組,而數組又是用指針表示的。如果您比較兩個指針(ptr1 == ptr2),它只會檢查兩個字符串是否指向內存中的相同地址。由於字符串由幾個字符組成,因此必須迭代才能正確比較。幸運的是,標準庫已經爲此提供了一種方法。

修正了一個或兩個錯字,這是你會得到什麼:

char *names[50][32]; 
char *states[50][2]; 
    i = 0; // Assuming this is declared somewhere else 
while (i < b) { 
    if (strcmp(states[i], "tx") == 0) { 
     printf("a string %s\n", names[i]); 
    } 
    i = i + 1; 
} 

你或許應該同時檢查文檔爲strcmp

編輯:因爲這已經是公認的答案,所以我還應該包含一個修正,如@dbush所述。統計數組顯然缺少額外字符串終止符的空間,因爲字符串是以C終止的NULL。名稱數組可能會也可能不會遇到同一問題,但尚不清楚。無論如何,值得注意的是,兩者都應該包含一個額外的字節來存儲終止符:

char names[50][33]; 
char states[50][3]; 

支持@dbush。

+0

非常感謝你,我會檢查出strcmp,我從來沒有聽說過它之前 – Michael

+0

在這種情況下,我建議你看看[string.h/cstring](http://www.cplusplus.com/reference/cstring/)的文檔。瞭解C語言中的字符串函數,它們對於幾種場景很有用。 –

+0

看我的編輯。 @dbush注意到我沒有的東西。 –

1

您的陣列的聲明顯示不正確:

char *names[50][32]; 
char *states[50][2]; 

這些聲明對二維數組字符指針的,這可能不是你想要的。

char names[50][32]; 
char states[50][3]; 

這些是字符的二維數組或字符串的交替數組。請注意,states數組有空格用於終止NULL的額外字符。

在這種if聲明這樣的:

if (state[i] = "tx");{ 

由於;的條件,即結束該塊if後立即發生。因此,大括號內的以下語句將始終運行。另外,=用於賦值,不用於比較,但使用==也不合適,因爲該運算符不會比較字符串,而是比較它們的地址。您需要使用strcmp進行字符串比較。

所以固定的代碼應該是這樣的:

char names[50][32]; 
char states[50][3]; 

... 

i = 0; 
while (i < b) { 
    if (strcmp(state[i],"tx") == 0) { 
     printf("a string %s\n", names[i]); 
    } 
    i = i + 1; 
} 
+0

'strcmp'應該比較爲零! –

+0

@AndréFratelli謝謝。修正了 – dbush

+0

另外請注意,您忘記了最後一個示例中空終止符的額外字節。由於我的回答已經被接受,我將其列入並給了你信用。我希望你不介意。 –