2015-08-18 39 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';