【问题标题】:C - Print one word per lineC - 每行打印一个单词
【发布时间】:2021-05-26 00:48:30
【问题描述】:

我正在尝试将以下 C 程序的版本包含在一本著名的 C 编程语言书籍中:

编写一个程序,每行打印一个单词。 这是我的代码:

#include <stdio.h>
#define OUT 1
#define IN 0

int main(void){
    char c;
    int state = OUT; /*Indicates if we are IN a white space, tab, nl or if we are OUT (a simple letter)*/

    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\n' || c == '\t')
        {
            state = IN;
            putchar('\n');      
        } else 
            if(state == IN){
                state = OUT;
                putchar(c);
            } 
    }   
    return 0;
}

为了测试它,我尝试作为输入:

  • 程序输出为“a”的“abc”。
  • “a b c”程序输出为每行一个字母。

正确地说,“abc”是因为getchar()函数而被连接起来的,它只记住“c”变量中的一个字符? 这也是正确的,说“a b c”被 getchar() 函数处理了 3 次(3 次迭代),因为每个字母之间有空格?

【问题讨论】:

  • char c; -> int c as getchar 返回 int

标签: c getchar


【解决方案1】:

正确地说,“abc”是因为getchar()函数,它只记住“c”变量中的一个字符?

这是不正确的,getcharchar 解析为char,它没有截断,发生的情况是state 仅在空格时被分配IN,输入了换行符或制表符。

由于putchar(c) 的执行依赖于state 等于IN,它从不打印任何内容,除非在某些时候输入这三个空白字符之一,在这种情况下,它将打印下一个字符或@ 987654330@ 为这 3 个空白字符之一。

这也是正确的,说“abc”被 getchar() 函数作为单个字符处理了 3 次(迭代时 3 次),因为每个字母之间有一个空格?

getchar() 读取所有 5 个字符,输出将是:

b 
c

由于上一个问题中解释的原因。

脚注

应将getchar() 分配给int,这是它的返回类型,将其分配给char 是有问题的,因为char 可能是无符号的,而EOF 通常是-1

【讨论】:

  • 关于您的脚注。对于“char 可能未签名”,您的意思是 char 可能会因其平台/编译器而改变?
  • @GabrieleBerselli 是的,确切地说,它的实现已定义,更多内容在这里stackoverflow.com/q/2054939/6865932
  • 在 getchar() 读取的 5 个字符中,您可能忘记了“a”? (你只写了“b c”)只是为了理解你回答得更好。
  • @GabrieleBerselli,你看,它只在stateIN0 时打印,如果你愿意的话,但这只会在输入空格时发生,所以a 不会得到打印,因为它前面没有空格。
  • 我现在明白了。我犯了一个逻辑错误,只是从“state = IN”想到你的答案。所以你的意思是(正如你的编译演示)第一个 char 被“跳过”,因为我们在第一个 ' ' char 之后输入“state = IN”,它就在“a”char 旁边。
猜你喜欢
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多