【问题标题】:Problems using char and scanf and the for loop?使用 char 和 scanf 以及 for 循环的问题?
【发布时间】:2014-12-10 16:34:25
【问题描述】:

我的问题是使用 char 和 scanf。您可以在下面找到我几乎可以正常工作的代码。问题与 for 循环有关。你看,我想问用户 10 个字符,并计算字母,但 for 循环无法正常工作。它对输入进行正确计数。例如,如果用户输入 6,可以,或者 a,也可以,但是如果他输入例如 10 或 11,那么程序认为用户输入了 2 个不同的字符,但实际上用户只输入了一个字符“10”。因此,请帮助我并解释为什么带有 char 的 scanf 不能正常工作。谢谢!

#include <stdio.h>
#include <stdlib.h>


unsigned int countalpha(void){

printf("Please enter 10 characters:\n");

char b;
int sum = 0;
int i = 0;

for (i = 0; i<10; i++)
    {
    scanf("%c\n", &b);


    if (isalpha(b))
        sum = sum +1;
    else
        sum = sum;

    }


    return sum;

}

int main()
{
    int sum;

    sum = countalpha();
    printf ("Letters totally: %d", sum);

    return 0;
}

【问题讨论】:

  • 嗯,它工作正常。 “10”有 2 个字符 1 和 0!
  • 为什么你会认为“10”和“11”是一个字符?您究竟期望什么被视为“一个角色”?任何连续数字的序列?

标签: c


【解决方案1】:

scanf() 函数很难正确使用。

scanf() 格式字符串中的尾随空格对于交互式输入来说是恶魔般的。符号"%c\n" 表示“读取一个字符;然后跳过后面的空格,直到下一个不是空格的字符,然后才从函数中返回。这很少是你想要的。用户需要输入一个字符,可能是a,然后是一个回车,另一个是空格,等等,但输入不会返回,直到他们沮丧地输入“你这个愚蠢的程序”(和换行符),此时一切突然开始工作,除了他们的评论可能不是下一个输入的正确响应。或者他们遇到了中断并且再也不会运行你的程序,因为这对他们来说太令人沮丧了。

请注意,scanf() 格式字符串中的任何空白字符都表示“跳过可选空白”,这意味着如果存在空格、制表符、换行符(以及其他更晦涩的字符),则将跳过它们,但如果没有空白。另请注意,无论如何都不会跳过空格的唯一转换说明符是%c%[...]%n;所有其他转换说明符都会自动跳过空格。

您可能应该使用" %c"。这意味着“跳过空格,然后返回不是空格的字符”。或者,给定您的代码,您可以简单地使用"%c",或者更好的是:

int c;
while ((c = getchar()) != EOF)
{
    if (isalpha(c)
        sum++;
}

如果你想要面向行的输入,不要使用scanf()fscanf();使用fgets()getline() 后跟sscanf()

顺便说一句:

else
    sum = sum;

毫无意义。编译器可能会将它们优化掉,但不应强迫其他人阅读它们并对您的想法感到困惑。

【讨论】:

  • 恶魔般的 Darth-scanf("%c") 再次来袭!拥抱黑暗面 Obi-wan Leffler - 不要使用getchar(),而是使用gets(),我们将一起统治银河系 - 无论我们走到哪里都会破坏用户记忆! ;-)
【解决方案2】:

用户是否应该在每个字符之间按 ENTER 键?您的格式字符串 "%c\n" 表明他们应该这样做,但您的问题陈述另有说明。尝试删除\n

进一步点:

  • scanf() 返回解析和分配的项目数。您应该始终检查此退货,以确保分配了预期的商品数量。
  • 以下代码毫无意义,应删除:
    else
        sum = sum;

【讨论】:

  • 是的,但是删除 \n 没有帮助,因为现在如果用户输入 5 然后按 enter 输入第二个字符,程序将其计为第三个输入,因为它现在计算 enter作为一个字符
  • 那么您应该在scanf 周围放置另一个循环,或者减少i 以忽略b == '\n' 的情况。
  • 真的,这是正确的做法吗?我的意思是,没有更简单的方法吗?
  • 这不是 OP 想要的。他希望将“10”、“11”等视为一个字符而不是两个字符。
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2012-07-10
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
相关资源
最近更新 更多