#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;
}
答案 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++]));}