2015-08-18 13 views
0

我試圖找到共同的子字符串和打印「是」如果它存在的代碼。沒有得到正確的輸出檢查共同的子字符串

實施例:

T=1 (NUMBER OF TEST CASES) 
hello 
world 

輸出:

YES ('O' is common in both) 

代碼:

#include<stdio.h> 
#include<string.h> 
int main(void){ 

    int T,t; 
    scanf("%d",&T); 
    char A[100],B[100]; 
    int i,j,flag=0; 
    t=1; 
    while(t<=T){ 
     scanf("%[^/n]",&A); 
     scanf("%[^/n]",&B); 
     for(i=0;A[i]!='\0';i++){ 
      for(j=0;B[j]!='\0';j++){ 
       if(A[i]==B[j]){ 
        flag=1; 
        break; 
       } 
      } 
     } 
     t++; 
     if(flag==1) 
      printf("YES"); 
     else 
      printf("NO"); 
     flag=0; 
     printf("\n"); 
    } 
    return 0; 
    } 

如果我讀取使用fgets(A,100,stdin)隨後fgets(B,100,stdin)字符串,編譯器不讀取第二串(它由於某種原因正在跳過聲明)。

此外,當我在while循環內使用fgets語句時,它根本不讀取字符串。

+4

'的scanf( 「%d%* C」,&T);','的scanf(「%[^/n的]「,&A);' - >'scanf(」%[^ \ n]%* c「,A);' – BLUEPIXY

+0

當使用函數:scanf()和函數族時,總是檢查返回的值2)使用格式輸入/轉換器進行刺激時,總是將輸入字符的最大數量限制爲比輸入緩衝區中的字符數少1。 – user3629249

+0

第一次調用scanf()將在輸入緩衝區中保留'\ n'。需要在調用'string'輸入函數之前讀入/放棄。 – user3629249

回答

0

在讀入數組時,不應在數組名前使用&。所以,你scanf S的關係是這樣的:

scanf("%[^/n]",A); 
scanf("%[^/n]",B); 

這是因爲數組的指針來實現和A是陣列的開始在該位置的地址。

在循環之前有一個scanf。來自該輸入的輸入並未從導致該問題的緩衝區中完全移除。你可以使用fflush(stdin);來做到這一點。這裏是工作代碼:

#include<stdio.h> 
#include<string.h> 

int main(void){ 

    int T, t; 
    scanf("%d", &T); 
    char A[100], B[100]; 
    int i, j, flag = 0; 
    t = 1; 
    while (t <= T){ 
     int ch; 
     while((ch = getchar()) != '\n' && ch != EOF); 
     fgets(A, sizeof(A), stdin); 
     fgets(B, sizeof(B), stdin); 
     for (i = 0; A[i] != '\0'; i++){ 
      for (j = 0; B[j] != '\0'; j++){ 
       if (A[i] == B[j]){ 
        flag = 1; 
        break; 
       } 
      } 
     } 
     t++; 
     if (flag == 1) 
      printf("YES"); 
     else 
      printf("NO"); 
     flag = 0; 
     printf("\n"); 
    } 
    return 0; 
} 

break;讓你跳出內循環。在flag == 1的情況下,您可能還需要break

+0

我已經改變了scanf部分,但現在它繼續接受輸入(並最終顯示錯誤的輸出)。你可以在編譯器中運行代碼,看看我哪裏出錯了。我已經嘗試過在線編譯器。它也顯示錯誤的輸出:。 –

+0

更新了響應。 – unxnut

+0

這一行:'這是因爲數組是用指針實現的,而A是從該位置開始的數組的地址。'並不完全正確。實現和預期完全一樣(以及字節數組);然而,在C中,當引用數組名稱時,實際獲得的是數組第一個字節的地址。 – user3629249

0

'\n'永遠不會被scanf()調用消耗。 scanf("%[^/n]",&B)的返回值肯定不是1,因爲B因爲'\n'因爲它停止掃描而沒有保存。

// bad 
char A[100],B[100]; 
scanf("%[^/n]",&A); 
scanf("%[^/n]",&B); 

推介限制輸入到允許與fgets()空間,當然不使用gets()

char A[100], B[100]; 

// fgets() returns NULL on End-of-file or IO error 
if (fgets(A, sizeof A, stdin) == NULL) return -1; 
if (sscanf(A, "%d",&T) != 1) return -1; // number not entered 

if (fgets(A, sizeof A, stdin) == NULL) return -1; 
A[strcspn(A, "\n")] = '\0'; // remove potential trailing \n 

if (fgets(B, sizeof B, stdin) == NULL) return -1; 
B[strcspn(B, "\n")] = '\0'; 
相關問題