无法从scanf获取字符串的正确输入(作为数组的字符)
罗伊想在编程比赛中提高打字速度。因此,他的朋友建议他反复输入“敏捷的棕色狐狸跳过懒惰的狗”这句话,因为它是一只盘羊。盘古图是至少使用一次字母表中的每个字母构成的句子 在把这个句子打了好几遍之后,罗伊对它感到厌烦了。于是他开始寻找其他的盘羊 给出一个句子s,告诉罗伊这是不是一个盘古游戏 输入格式输入由包含s的行组成 约束条件 s的长度最多可为103 1≤||≤103并且它可以包含空格、小写和大写字母。字母的小写和大写实例被认为是相同的 输出格式如果s是pangram,则输出包含pangram的行,否则不输出pangram无法从scanf获取字符串的正确输入(作为数组的字符),c,string,io,C,String,Io,罗伊想在编程比赛中提高打字速度。因此,他的朋友建议他反复输入“敏捷的棕色狐狸跳过懒惰的狗”这句话,因为它是一只盘羊。盘古图是至少使用一次字母表中的每个字母构成的句子 在把这个句子打了好几遍之后,罗伊对它感到厌烦了。于是他开始寻找其他的盘羊 给出一个句子s,告诉罗伊这是不是一个盘古游戏 输入格式输入由包含s的行组成 约束条件 s的长度最多可为103 1≤||≤103并且它可以包含空格、小写和大写字母。字母的小写和大写实例被认为是相同的 输出格式如果s是pangram,则输出包含pangram的行,
void panagram(char s[])
{
int num1[26]={0};
int num2[26]={0};
int len=strlen(s);
int count=0,j,i;
for(i=0;i<len;i++)
{
if(s[i]>=97&&s[i]<=122)
{
num1[s[i]-97]++;
}
if(s[i]>=65&&s[i]<=90)
{
num2[s[i]-65]++;
}
}
for(j=0;j<26;j++)
{
if(num1[j]>=1||num2[j]>=1)
{ printf("%d\t\t%d\n",num1[j],num2[j]);
count++;
}
}
printf("%d\t",count);
if(count>=26)
printf("panagram");
else
printf("not panagram");
}
int main() {
char s[1000];
scanf("%s",s);
panagram(s);
return 0;
}
该代码适用于没有空格的字符串,如WePromplyDejustedAntiqueIvoryBucklesForthenExtPrize,但不适用于有空格的字符串-我们立即将仿古象牙扣评选为下一个奖项
谁能告诉我哪里出了问题?
我是否输入错误?而不是scanf使用
在阅读字符串时使用scanf从来都不是一个好主意。所以我建议您使用fgets
PS:fgets带有换行符并抑制换行符。代替scanf使用
在阅读字符串时使用scanf从来都不是一个好主意。所以我建议您使用fgets
PS:fgets带有换行符并抑制换行符。根据C11标准 7.21.6.2 fscanf功能 [……] 转换说明符及其含义如下: [...] s匹配一系列非空白字符。286 [...] 你有
scanf("%s",s);
要获取输入,%s将停止扫描输入,直到遇到错误。根据C11标准,空格是一个空白字符:
6.4词汇要素
[……]
[...]
预处理令牌可以用空格分隔;这包括后面描述的注释,或空格字符、水平制表符、新行、垂直制表符和换页符,或两者兼而有之
[...]
因此,当%s看到第一个单词后的空格时,它将停止扫描。
如中所示,使用FGET解决此问题;如果需要使用scanf,请使用
上面的scanf读取所有内容,直到遇到换行符为止。更好的方法是将scanf读取的字符数限制为999,以防止出现错误,同时检查scanf的返回值以查看是否成功。在您的情况下,如果scanf成功,返回值将为1
注:与fgets不同,上述修复将在标准输入流stdin中保留换行符。根据C11标准 7.21.6.2 fscanf功能 [……] 转换说明符及其含义如下: [...] s匹配一系列非空白字符。286 [...] 你有
scanf("%s",s);
要获取输入,%s将停止扫描输入,直到遇到错误。根据C11标准,空格是一个空白字符:
6.4词汇要素
[……]
[...]
预处理令牌可以用空格分隔;这包括后面描述的注释,或空格字符、水平制表符、新行、垂直制表符和换页符,或两者兼而有之
[...]
因此,当%s看到第一个单词后的空格时,它将停止扫描。
如中所示,使用FGET解决此问题;如果需要使用scanf,请使用
上面的scanf读取所有内容,直到遇到换行符为止。更好的方法是将scanf读取的字符数限制为999,以防止出现错误,同时检查scanf的返回值以查看是否成功。在您的情况下,如果scanf成功,返回值将为1
注意:与FGET不同,上述修复将在标准输入流stdin中保留换行符。可能重复的
scanf("%[^\n]",s);