2016-07-31 154 views
3

我想要一個程序從用戶讀取兩個單詞並打印第一個單詞中出現的第二個單詞的次數。故障循環'for'和'while'

當我與for循環,因爲我想,但是當我寫與while環和特定的輸入嘗試,它並沒有給出正確的結果,它的工作原理完全寫。我無法弄清楚爲什麼。代碼片段如下。

for循環:

#include <stdio.h> 

int main() 
{ 
    char text[200], search[20]; 
    int i, j, count = 0; 
    scanf("%s %s", text, search); 
    for (i = 0; text[i] != '\0'; i++) { 
     for (j = 0; search[j] != '\0' && search[j] == text[i + j]; j++) { 
     } 
     if (search[j] == '\0') { 
      count++; 
     } 
    } 
    printf("%d", count); 
} 

while循環:

#include <stdio.h> 

int main() 
{ 
    char word[50], search[50]; 
    int i, j, count = 0; 
    scanf("%s %s", word, search); 
    i = 0; 
    while (word[i] != '\0') { 
     j = 0; 
     while (search[j] != '\0' && search[j] == word[i + j]) { 
      j++;     
     } 
     if (search[j] == '\0') { 
      count++; 
     } 
     i++; 
    } 
    printf("%d", count); 
} 

,並輸入與for循環工作,但不while循環給出正確的結果:

athousandyearsofthousandtimesandinthousandplacesOand... and 

它應該打印4,但它打印3026483

+0

你的空間條被破壞了嗎?另外,不檢查'scanf()'的返回值是不好的。 –

+3

你的輸入字符看起來比49個字符長 – Joni

+1

雖然你只是把while循環改爲while循環。您還將'text [200]'更改爲'單詞[50]'和將'搜索[20]'更改爲'搜索[50]'。 – immibis

回答

4

for邏輯和while邏輯都是正確的。問題在於輸入緩衝區的大小。

在第一個程序text是200個字符,而在第二個word是50個字符。您的輸入字符串長度爲55個字符,因此超出了您的輸入緩衝區,導致undefined behavior

使第二個程序中的輸入緩衝區變大,它應該可以正常工作。