我尝试使用代码查找公共子字符串并打印" 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
语句时,它根本不会读取字符串。
答案 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>)