在检查公共子字符串

时间:2015-08-18 18:02:29

标签: c

我尝试使用代码查找公共子字符串并打印" YES"如果它存在。

示例:

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)读取字符串,则编译器不会读取第二个字符串(由于某种原因它正在跳过该语句)。

另外,当我在fgets循环中使用while语句时,它根本不会读取字符串。

2 个答案:

答案 0 :(得分:0)

当您读入数组时,不应在数组名称前使用&。因此,您的scanf应如下所示:

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;将你带出内循环。如果break {。}},您可能还需要flag == 1外部循环。

答案 1 :(得分: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';

setenv('LD_LIBRARY_PATH', <content of LD_LIBRARY_PATH from terminal>)