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

Cannot take proper input from scanf for string (as a character of arrays)

Problem statement

Roy 想提高编程比赛的打字速度。所以,他的朋友建议他反复打出“The quick brown fox jumps over the lazy dog”这句话,因为这是一个拼音。 (Pangrams 是通过使用字母表中的每个字母至少一次来构造的句子。)

这句话敲了好几遍,罗伊就厌倦了。于是他开始寻找其他的pangram

给定一个句子 s,告诉 Roy 它是否是 pangram。

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

约束条件 s的长度最多为103(1≤|s|≤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;
    }

该代码适用于没有空格的字符串,例如“Wepromptlyjudgedantiqueivorybucklesforthenextprize”,但不适用于有空格的字符串——“我们及时判断了下一个奖项的古董象牙扣” 谁能告诉我哪里出错了? 我是不是输入错误了?

而不是 scanf() 使用

fgets(s,sizeof(s),stdin);

阅读时使用scanf()绝对不是一个好主意strings.So我建议你使用fgets()

PS:fgets()自带换行符,抑制换行符

根据 C11 标准,

7.21.6.2 The fscanf function

[...]

  1. The conversion specifiers and their meanings are:
    [...]
    s. Matches a sequence of non-white-space characters. 286
    [...]

你有

scanf("%s",s);

征求意见。 %s 将停止扫描输入,直到遇到 whitespace character。根据 C11 标准,space 是一个白色 space 字符:

6.4 Lexical elements

[...]

  1. [...]
    Preprocessing tokens can be separated by white space; this consists of comments (described later), or white-space characters (space, horizontal tab, new-line, vertical tab, and form-feed), or both
    [...]

因此,当 %s 看到第一个单词后的 space 时,它会停止扫描。


使用 fgets 解决问题,如 所示,或者如果您需要使用 scanf,请使用

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

上面的scanf读取所有内容,直到遇到换行符。更好的方法是限制 scanf 读取的字符数量(在您的情况下最多为 999)以防止 buffer overflows 并检查 return 的值 scanf 查看是否成功(如果 scanf 成功,return 值将为 1)。

注意:与 fgets 不同,上述修复将在标准输入流 (stdin) 中保留换行符。