pangram函数在c中不起作用

时间:2015-01-03 08:00:21

标签: c

#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
#include<string.h>
#define number_of_letters 26
bool IsPangram(char* string);
int main(){
char check[100];

当我把输出作为“快速的棕色狐狸跳过懒狗”时输出不是pangram 当我在一行上放置一个z值时,会给出正确的输出

scanf("%s",&check);

if(IsPangram(check)){
    printf("the string entered is pangram");
}
else{
    printf("not a pangram");
}

return 0;
}

有pangram的功能

 bool IsPangram(char* string){
 bool flags[number_of_letters];
 int size=strlen(string);
 bool ispangram=true;
 int i;
 char c;
 // for all the alfabets to be setting them to false
  for(i=0;i<number_of_letters;i++){
    flags[i]=false;
  } 
 // for converting the uppper case letter to the small one
for(i=0;i<size;i++){
    c=tolower(string[i]);
    if(islower(c)){
        flags[string[i]-'a']=true;
    }     
   }
 // for checking the the lettters to no pangram
   for(i=0;(i<number_of_letters && ispangram==true);i++){
    if(flags[i]==false){
        ispangram=false;
    }

 }
 return ispangram;
 }

4 个答案:

答案 0 :(得分:3)

将字符串作为&传递时不需要使用char *,因为当作为参数传递时,数组会衰减为指针。

所以:

scanf("%s",&check);

应该是:

scanf("%s", check);

一些一般建议:打开编译器警告以帮助捕获这样的简单错误,并学习基本的调试技术(在调试器中逐步执行代码,添加战略printf语句等)。

答案 1 :(得分:1)

scanf无法获取带空格的字符串。所以请使用fgets

fgets(check,sizeof(check),stdin);

或使用

scanf("%[^\n]s",check);

这会读取字符串,直到遇到换行符。 当遇到space时,默认scanf将停止读取。

答案 2 :(得分:1)

带有scanf()格式说明符的

%s将停留在空白处。请尝试fgets(check,100,stdin)代替...将读取(最多)一整行,并将字符数限制为99 + nul,这样您就不会超过check的大小。它可能会留下换行符作为最后一个字符,但无论如何你的算法都会忽略它。

此外,在IsPangram()中,c应该是int而不是char(以匹配tolower()等),并更改此权限:< / p>

 // for converting the uppper case letter to the small one
for(i=0;i<size;i++){
    c=tolower(string[i]);
    if(islower(c)){
        flags[string[i]-'a']=true;
    }     
   }

......对此:

 // for converting the uppper case letter to the small one
for(i=0;i<size;i++){
    c=tolower(string[i]);  /* <== c will always be lowercase */
    if(isalpha(c)){        /* <== Check that c is a letter */
        flags[c-'a']=true; /* <== use c, as string[i] may be uppercase */
    }     
   }

...由于添加的评论中指出的原因。

答案 3 :(得分:0)

您在这里:

#include <ctype.h>
void uc(char*s){for(;*s;*s=toupper(*s),s++);}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char*argv[])
  {int i,j,n=0,c[256]={0};
   char*s,*w[1024]={NULL};
   do w[n]=malloc(1024),fgets(w[n],1024,stdin),w[n][strlen(w[n])-1]='\0',uc(w[n]),n++;
   while(n<1024&&strlen(w[n-1]));
   for(--n,i=0;i<n;++i)
     for(j=0;j<strlen(w[i]);++j)
       c[w[i][j]]=1;
   for(j=0,i='A';i<='Z';++i)j+=c[i];
   printf("It's %sa pangram\n",j==26?"":"not ");
   for(i=0;i<=n;free(w[i++]));}