【问题标题】:Cannot take proper input from scanf for string (as a character of arrays)无法从 scanf 中获取正确的字符串输入(作为数组的字符)
【发布时间】:2015-04-29 10:28:05
【问题描述】:

Problem statement

Roy 想提高他在编程比赛中的打字速度。所以,他的朋友建议他反复输入“The quick brown fox jumps over the lazy dog”这句话,因为它是一个 pangram。 (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”,但不适用于带有空格的字符串 - “我们及时判断了下一个奖品的古董象牙扣” 谁能告诉我哪里出错了? 我输入错误了吗?

【问题讨论】:

标签: c string io


【解决方案1】:

按照 C11 标准,

7.21.6.2 fscanf 函数

[...]

  1. 转换说明符及其含义是:
    [...]
    s。匹配一系列非空白字符。 286
    [...]

你有

scanf("%s",s);

接受输入。 %s 将停止扫描输入,直到遇到 whitespace character。根据 C11 标准,空格是空白字符:

6.4 词法元素

[...]

  1. [...]
    预处理标记可以用空格分隔;这由 cmets(稍后描述)或空白字符(空格、水平制表符、换行符、垂直制表符和换页符)或两者组成
    [...]

所以,当%s 看到第一个单词后面的空格时,它会停止扫描。


使用fgets 修复问题,如@Gopi's answer 所示,或者如果您需要使用scanf,请使用
scanf("%[^\n]",s);

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

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

【讨论】:

    【解决方案2】:

    而不是scanf() 使用

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

    阅读字符串时使用scanf()绝对不是一个好主意。所以我建议你使用fgets()

    PS:fgets() 自带换行符并禁止换行符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2021-04-27
      • 2017-04-04
      • 2020-06-08
      • 2021-12-06
      • 2016-06-28
      相关资源
      最近更新 更多