Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从scanf获取字符串的正确输入(作为数组的字符)_C_String_Io - Fatal编程技术网

无法从scanf获取字符串的正确输入(作为数组的字符)

无法从scanf获取字符串的正确输入(作为数组的字符),c,string,io,C,String,Io,罗伊想在编程比赛中提高打字速度。因此,他的朋友建议他反复输入“敏捷的棕色狐狸跳过懒惰的狗”这句话,因为它是一只盘羊。盘古图是至少使用一次字母表中的每个字母构成的句子 在把这个句子打了好几遍之后,罗伊对它感到厌烦了。于是他开始寻找其他的盘羊 给出一个句子s,告诉罗伊这是不是一个盘古游戏 输入格式输入由包含s的行组成 约束条件 s的长度最多可为103 1≤||≤103并且它可以包含空格、小写和大写字母。字母的小写和大写实例被认为是相同的 输出格式如果s是pangram,则输出包含pangram的行,

罗伊想在编程比赛中提高打字速度。因此,他的朋友建议他反复输入“敏捷的棕色狐狸跳过懒惰的狗”这句话,因为它是一只盘羊。盘古图是至少使用一次字母表中的每个字母构成的句子

在把这个句子打了好几遍之后,罗伊对它感到厌烦了。于是他开始寻找其他的盘羊

给出一个句子s,告诉罗伊这是不是一个盘古游戏

输入格式输入由包含s的行组成

约束条件 s的长度最多可为103 1≤||≤103并且它可以包含空格、小写和大写字母。字母的小写和大写实例被认为是相同的

输出格式如果s是pangram,则输出包含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);