练习1-12。编写一个程序,每行打印一个输入的单词

时间:2015-07-03 21:38:49

标签: c

通过K& R的C编程语言,我为练习1-12编写了一个代码,用于所有意图和目的似乎都有效。但是,我很好奇如何调整它以适应跨越多行的更长时间的输入。我写的当前程序在输入后立即终止输入。有没有办法调整程序,所以输入只在我想要而不是换行符时终止?这是我用过的程序。

#include <stdio.h>

main()
{
    int c;

    while ((c = getchar()) != EOF)
    {
        if ( c == ' ' || c == '\n' || c == '\t' || c == '-')
            putchar('\n');
        else
            putchar(c);
    }
}

提前致谢。

3 个答案:

答案 0 :(得分:3)

只有当您按下ENTER键时,程序才会收到输入,因为这是典型终端在canonical mode中的运行方式。所以你要做的不是直截了当。但是,您可以使用文件输入程序 1

$./a.out < inputfile

或使用 here-document 输入整个文本:

$./a.out << _TEXT
type all the 
text you want here
and terminate 
it with CTRL+D 
which sends EOF to your program
or type _TEXT

(1)我假设一个unix样式的shell。 Windows powershell也提供相同的功能。

答案 1 :(得分:1)

您的代码很好 - 问题是终端默认会缓冲您输入的所有内容,直到您点击 Enter 。然后,您输入的内容实际上会写入流程stdin

要做你想做的事,你可以简单地读一行,直到用户为例,输入“print”。然后你可以遍历数组中的每个字符,并按照你已经做的那样做。

这个伪C代码将说明如何解决它:

for(;;) {
    // create a buffer that will hold the entered lines
    char* buffer = ...;

    // read multiple lines from the terminal until user types "print"
    for(;;) {
        char* line = readLine();

        if(strcmp(line, "print") == 0) {
            break;
        } else {
            // add the entered line to the buffer (null-terminating)
            addLineToBuffer(buffer, line);
        }
    }

    // perform your output loop for the characters in the buffer
    char* pos = buffer;
    while(*pos) {
        if (*pos == ' ' || *pos == '\n' || *pos == '\t' || *pos == '-') {
            putchar('\n');
        } else {
            putchar(*pos);
        }
        ++pos;
    }
}

答案 2 :(得分:0)

我刚刚使用了空格和制表符,但您可以在单词分隔上添加任何其他内容。此代码确保额外的空格或制表符不会产生任何空行。

int c;
while ((c = getchar()) != EOF){
        if (c == ' ' || c == '\t'){
            putchar('\n');
            while ((c = getchar()) == ' ' || c == '\t');  
        }
        putchar(c);