【问题标题】:getchar() != ' ' and getchar() = ' 'getchar() != ' ' 和 getchar() = ' '
【发布时间】:2019-12-26 17:55:31
【问题描述】:

我无法理解 getchar() != ' 'getchar() = ' ' 在我的代码中所做的事情。 为什么需要有对立面。 用户可以在名字和姓氏之间、名字之前和姓氏之后输入额外的空格。

#include <stdio.h>

int main(void) {

    char c, initial;

    printf("Enter a first and last name: ");
    scanf(" %c", &initial);
    printf("%c\n", initial);
    while ((c = getchar()) != ' ')
        ;

    while ((c = getchar()) == ' ')
        ;

    do {
        putchar(c);
    } while ((c = getchar()) != '\n' && c != ' ');

    printf(", %c.\n", initial);

    return 0;
}

【问题讨论】:

  • 请复制粘贴您的代码
  • 不用看你的代码,我可以告诉你getchar() = ' ' 的任何外观都只有一个目的:导致编译失败。
  • 无论如何,如果它是你的代码,那么你怎么不至少知道它的各个位应该服务于什么目的?
  • 这不是我的代码。我正在查看其他人在编程教科书中对相同练习的回答。代码并没有失败,而且运行良好。
  • @Nick "what getchar() != ' ' and getchar() = ' ' are doing in my code" 立即删除它们! :)

标签: c loops scanf getchar putchar


【解决方案1】:

在这段代码中sn-p

scanf(" %c", &initial);
// printf("%c\n", initial); <== remove this statement
while ((c = getchar()) != ' ')
    ;

读取名字的第一个字母,跳过其他字母。

这个循环

while ((c = getchar()) == ' ')
    ;

跳过名字和第二个名字之间的空格。

这个循环

do {
    putchar(c);
} while ((c = getchar()) != '\n' && c != ' ');

输出第二个名字的所有字母。

最后,第一个名字的第一个字母在完整的第二个名字之后输出。

所以如果你输入例如

Nick     Fisher

那么输出应该是

Fisher, N.

考虑到您应该删除该声明

printf("%c\n", initial);

这是一个多余的陈述。

【讨论】:

  • 非常非常感谢!这完美地解释了它
  • 如果输入的行中有前导空白字符,则原始代码将无法正常工作。
  • @LxerLx 你为什么这样决定?前导空格被跳过。
  • 输出不是实际发生的。由于:printf("%c\n", initial);,输出的第一行将是初始行
  • @VladfromMoscow 你是对的。 %c之前的空格我忽略了。
【解决方案2】:

关于:

while ((c = getchar()) != ' ')
    ;

while ((c = getchar()) == ' ')
    ;

第一个 while() 循环消耗名字的其余部分

第二个while() 循环使用名字和姓氏之间的空格。

【讨论】:

    【解决方案3】:

    使用 char 作为初始字符然后在其中写入大量字符是否有问题?我认为您使用未分配的内存作为名称。
    第一个printf("%c\n", initial); 应该生成输入的第一个字符的输出。

    太好了……
    输入:
    尼克·费雪

    输出:
    N
    北卡罗来纳州费舍尔

    或:

    费舍尔,N.
    或:
    由于禁止访问内存而导致程序崩溃

    问候安德烈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2017-03-04
      • 2011-10-30
      • 2017-03-26
      相关资源
      最近更新 更多