C 练习1-12。编写一个程序,每行打印一个字

C 练习1-12。编写一个程序,每行打印一个字,c,C,通过学习K&R的C编程语言,我为练习1-12编写了一段代码,无论出于何种目的,这段代码似乎都是可行的。然而,我开始好奇如何调整它以适应跨越多行的更长输入。我编写的当前程序在我按enter键时立即终止输入。有没有办法调整程序,使输入仅在我需要时终止,而不是由换行符终止?这是我使用的程序 #include <stdio.h> main() { int c; while ((c = getchar()) != EOF) { if ( c == '

通过学习K&R的C编程语言,我为练习1-12编写了一段代码,无论出于何种目的,这段代码似乎都是可行的。然而,我开始好奇如何调整它以适应跨越多行的更长输入。我编写的当前程序在我按enter键时立即终止输入。有没有办法调整程序,使输入仅在我需要时终止,而不是由换行符终止?这是我使用的程序

#include <stdio.h>

main()
{
    int c;

    while ((c = getchar()) != EOF)
    {
        if ( c == ' ' || c == '\n' || c == '\t' || c == '-')
            putchar('\n');
        else
            putchar(c);
    }
}
#包括
main()
{
INTC;
而((c=getchar())!=EOF)
{
如果(c=''| | c='\n'| | c='\t'| | c='-'))
putchar('\n');
其他的
普查尔(c);
}
}

提前感谢。

只有当您按下回车键时,程序才会收到输入,因为典型的终端就是这样工作的。所以你要求做的不是直截了当的。但是,您可以使用文件输入程序1:

$./a.out
或使用here文档键入整个文本:


$。/a.out只有当您按下回车键时,程序才会接收输入,因为典型的终端就是这样工作的。所以你要求做的不是直截了当的。但是,您可以使用文件输入程序1:

$./a.out
或使用here文档键入整个文本:


$。/a.out您的代码很好-问题是终端默认会缓冲您键入的所有内容,直到您按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;
    }
}

您的代码很好-问题是,终端默认会缓冲您键入的所有内容,直到您按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;
    }
}

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

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

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

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

仅当您关闭
stdin
(接收
EOF
)时,程序才会终止,这对于POSIX系统是ctrl-D,对于Windows是-IIRC-ctrl-Z。它不以换行符或
CR
终止。那么你到底有什么问题?@Olaf对我来说,这会调整程序,使输入仅在我需要时终止,而不是由换行符终止?足够清楚,并充分描述了问题。@BlueMoon:是的,但它已经只通过
EOF
终止输入了!除非您指的是阅读用户想法的计算机。@Olaf为了澄清,我使用Visual Studio工具中的Developer命令提示符进行编程,每当我按enter键开始新的输入行时,程序只会显示输出,实际上是过早地结束输入。不管怎样,我现在明白了。谢谢你花时间帮我。好了,思想阅读到此为止;-)仅当您关闭
stdin
(接收
EOF
)时,程序才会终止,这对于POSIX系统是ctrl-D,对于Windows是-IIRC-ctrl-Z。它不以换行符或
CR
终止。那么你到底有什么问题?@Olaf对我来说,这会调整程序,使输入仅在我需要时终止,而不是由换行符终止?足够清楚,并充分描述了问题。@BlueMoon:是的,但它已经只通过
EOF
终止输入了!除非您指的是阅读用户想法的计算机。@Olaf为了澄清,我使用Visual Studio工具中的Developer命令提示符进行编程,每当我按enter键开始新的输入行时,程序只会显示输出,实际上是过早地结束输入。不管怎样,我现在明白了。谢谢你花时间帮我。好了,思想阅读到此为止;-)谢谢,我想我可能把事情复杂化了。我感谢你的帮助!谢谢,我想我可能把事情复杂化了。我感谢你的帮助!谢谢,这是有道理的,我真的很感激伪代码帮助我更好地理解。谢谢,这是有道理的,我真的很感激伪代码帮助我更好地理解。