通过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);
}
}
提前致谢。
答案 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);