【问题标题】:Why doesn't the first letter of my string print?为什么我的字符串的第一个字母不打印?
【发布时间】:2016-10-06 13:48:18
【问题描述】:

我正在尝试编写一段代码,要求用户输入他们的姓名。然后它应该读取他们名称的每个字符并按照我的选择对其进行格式化(在下面的代码中,它在每个字符之后添加一个新行)。

我遇到的问题是,当有人输入他们的名字时,它不会打印第一个字母,而是打印出其余的字母。

例如,如果我要输入 Sneek,它只会显示 neek。

现在我是编程的初学者,对于 C 语言更是如此,所以我想知道我的 scanf 语句或循环是否有问题。

另外,如果我输入 Sneek,它会显示 neek,但如果我再次输入 Sneek,它会显示为 Sneek,所以我假设循环没有问题?

我在这个问题上搜索了很长时间,但似乎找不到任何答案,非常感谢任何帮助。

char ch;
printf("Please enter name:  ");
ch = scanf("%c", &ch);

while ((ch = getchar()) != EOF) {
    printf("%c\n", ch);

}
return 0;

【问题讨论】:

标签: c scanf


【解决方案1】:

代码片段存在多个问题:

  • ch = scanf("%c", &ch); 没有任何用处,甚至没有正确地将文件中的一个字节读入ch。请注意,scanf 确实将字节存储到 ch,但是当您将返回值也存储到 ch 时,它会立即被覆盖。只需删除此行。

  • while ((ch = getchar()) != EOF) { printf("%c\n", ch); } 适合您的目的,但 ch 的类型 必须int 而不是 char 以适应 unsigned char 的所有值和特殊值EOF。正如当前所写,您的代码将无法在char 是无符号类型的平台上停止在文件末尾。

【讨论】:

  • 我同意scanf() 没有帮助,但是“甚至无法从文件中正确读取一个字节”的问题是什么?对我来说它看起来不错,除非你抱怨它没有检查字符是否被成功读取,这应该有不同的特征(因为“你没有检查 I/O 操作是否有效”)。
  • @JonathanLeffler:违规的scanf()从文件中读取一个字节,将其存储到ch,如果成功则返回1,然后将其存储到同一个变量ch中。出于参数的考虑,从流中正确读取了字节,但未正确存储其值以供进一步使用;-)
  • 啊;我错过了对ch 的分配(以及在参数列表中使用它)。是的;这太骇人听闻了——而且“没有正确阅读”是准确的。我应该发现这种滥用行为,但也许你可以指出它有多糟糕(这对每个人来说可能并不明显)。
【解决方案2】:

注释掉ch = scanf("%c", &ch);。您正在使用那里的第一个字符并且从不打印它。

【讨论】:

    【解决方案3】:

    该语句通过scanf从标准输入读取一个字符。

    ch = scanf("%c", &ch);
    

    这个循环通过getchar从标准输入读取字符。

    while ((ch = getchar()) != EOF) {
        printf("%c\n", ch);
    
    }
    

    使用scanf 读取第一个字符后会发生什么情况?它被getchar 的结果覆盖。

    【讨论】:

      【解决方案4】:

      我没有看到问题。你得到第一个字符。之后,您将获取并打印字符,直到 EOF。

      它没有打印第一个字符,因为你没有告诉它。

      【讨论】:

        猜你喜欢
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 2022-08-23
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-10
        相关资源
        最近更新 更多