检查字符串

时间:2015-08-28 14:40:48

标签: c

这是我正在努力解决的问题:

输入
第一行包含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 ();
 }

3 个答案:

答案 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个标志。总是尝试编写简单的代码,而不是使用不必要的变量和标志。