这是我正在努力解决的问题:
输入:
第一行包含N,即字符串的大小。
第二行包含字母(仅限小写)。
输出:
如果在字符串中找到所有元音,则打印YES
,否则为NO
。
约束:
字符串的大小不会大于10,000。 1 ≤ N ≤ 10000
我写的以下代码始终显示NO
。
#include <stdio.h>
#include<conio.h>
int main()
{
int a,b,c=0,d=0,e=0,f=0,g=0,i;
char string[10000];
scanf("%d",&a);
scanf("%s",string);
for(i=0;i<a;a++)
{
if(string[i]==('a'))
c=1;
if(string[i]==('e'))
d=1;
if(string[i]==('i'))
e=1;
if(string[i]==('o'))
f=1;
if(string[i]==('u'))
g=1;
}
if((c==1)&&(d==1)&&(e==1)&&(f==1)&&(g==1))
printf("YES");
else
printf("NO");
return 0;
getch ();
}
答案 0 :(得分:2)
这是一个导致问题的无限循环:
for(i=0;i<a;a++)
你应该增加i,而不是(字符串的长度)。如果你在循环语句中修复这个char,程序将运行良好。无论如何,我改变了你的代码以使其更具可读性。先生,看看你想要的信息,先生:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int len, a=0, e=0, i=0, o=0, u=0, it;
char string[10000];
scanf("%d", &len);
scanf("%s", string);
for(it=0;it<len;it++)
{
if(string[it]=='a') a = 1;
else if(string[it]=='e') e = 1;
else if(string[it]=='i') i = 1;
else if(string[it]=='o') o = 1;
else if(string[it]=='u') u = 1;
}
if(a && e && i && o && u) printf("YES\n");
else printf("NO\n");
system("PAUSE");
return 0;
}
我假设你在Windows下运行你的程序,所以不是使用conio getch()
而是尝试使用system("PAUSE")
或更好的方法(对于Windows for UNIX): getchar()
答案 1 :(得分:1)
我已经重命名了所有变量,但在其他方面保留了相同的代码。
#include <stdio.h>
#include<conio.h>
int main()
{
int foundA = 0, foundE = 0, foundI = 0, foundO = 0, foundU = 0;
int i, length;
char string[10000];
scanf("%d", &length);
scanf("%s", string);
for(i=0; i<length; length++)
{
if(string[i]==('a'))
foundA=1;
else if(string[i]==('e'))
foundE=1;
else if(string[i]==('i'))
foundI=1;
else if(string[i]==('o'))
foundO=1;
else if(string[i]==('u'))
foundU=1;
}
if((foundA==1)&&(foundE==1)&&(foundI==1)&&(foundO==1)&&(foundU==1))
printf("YES");
else
printf("NO");
return 0;
getch ();
}
查看for循环条件for(i=0; i<length; length++)
,我认为很明显错误。您不是递增计数器,而是递增字符串的长度。最终,计数器溢出为负数,并且循环终止而不会查看除第一个之外的字符。这里的教训是正确命名变量。
如果你想挑剔,那么有符号整数溢出是未定义的行为,但对于大多数系统,INT_MAX + 1将是INT_MIN。
答案 2 :(得分:1)
此程序可以更简单的方式完成,如下所示。
#include <stdio.h>
#include<conio.h>
int main()
{
int i, flag = 0;
char string[10000], *ptr;
char cmp[] = "aeiou";
printf("Please enter string = " );
scanf("%s", string);
i = 0;
while(cmp[i])
{
ptr = string;
while(*ptr)
{
if(cmp[i] == *ptr)
break;
ptr++;
}
if(*ptr != cmp[i++])
{
flag = 1;
break;
}
}
if(flag == 1)
printf("NO");
else
printf("YES");
}
在这个程序中,我只使用了一个标志而不是5个标志。总是尝试编写简单的代码,而不是使用不必要的变量和标志。