我写了这段代码,但我有点问题。这段代码应该得到一个字符串,并检查这个字符串是否包含所有字母...如果它不输出是“不是一个pangramma!”。如果是“PanGramma!”。探索是我想要计算单词之间空格的数量。但是当输入是至少有一个空格的字符串时,输出将始终为“Not a PanGramma!”,即使它包含所有字母。有人可以帮帮我吗?
#include <stdio.h>
char UpCase (char c);
int isPangram (char *str);
int main()
{
char str[100];
printf("Please enter yout string: \n");
scanf("%s", str);
if (isPangram (str) == 1)
{
printf("PanGramma!\n");
}
else
{
printf("Not a PanGramma!\n");
}
return 0;
}
char UpCase (char c)
{
if (c>='a' && c<='z')
{
return c-'a'+'A';
}
return c;
}
int isPangram (char *str)
{
int i=0;
int hist[27]={0};
while (str[i] !=0)
{
str[i]=UpCase(str[i]);
if (str[i] == ' ')
{
hist[26]++;
}
else
{
hist[str[i] - 'A']++;
}
i++;
}
for (i=0; i<26; i++)
{
if(hist[i] == 0)
{
return 0;
}
}
return 1;
}
你的问题来自scanf
函数的使用:它会在它捕获的每个空白处停止。
来自man scanf:
%S
匹配一系列非空白字符;下一个指针必须是指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节('\ 0'),这是自动添加的。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。
要使程序正常工作,可以使用fgets
函数:
int main()
{
char str[100];
printf("Please enter yout string: \n");
fgets(str, sizeof str, stdin);
if (isPangram (str) == 1)
{
printf("PanGramma!\n");
}
else
{
printf("Not a PanGramma!\n");
}
return 0;
}
如果你想了解更多有关scanf
函数的信息,你可以阅读A beginners' guide away from scanf()。它还会告诉您为什么scanf
可能会导致代码中的缓冲区溢出。
感谢你们!我用过这个scanf(“%[^ \ n]%* c”,str);再次感谢您的帮助!