C 练习1-12。编写一个程序,每行打印一个字
通过学习K&R的C编程语言,我为练习1-12编写了一段代码,无论出于何种目的,这段代码似乎都是可行的。然而,我开始好奇如何调整它以适应跨越多行的更长输入。我编写的当前程序在我按enter键时立即终止输入。有没有办法调整程序,使输入仅在我需要时终止,而不是由换行符终止?这是我使用的程序C 练习1-12。编写一个程序,每行打印一个字,c,C,通过学习K&R的C编程语言,我为练习1-12编写了一段代码,无论出于何种目的,这段代码似乎都是可行的。然而,我开始好奇如何调整它以适应跨越多行的更长输入。我编写的当前程序在我按enter键时立即终止输入。有没有办法调整程序,使输入仅在我需要时终止,而不是由换行符终止?这是我使用的程序 #include <stdio.h> main() { int c; while ((c = getchar()) != EOF) { if ( c == '
#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键开始新的输入行时,程序只会显示输出,实际上是过早地结束输入。不管怎样,我现在明白了。谢谢你花时间帮我。好了,思想阅读到此为止;-)谢谢,我想我可能把事情复杂化了。我感谢你的帮助!谢谢,我想我可能把事情复杂化了。我感谢你的帮助!谢谢,这是有道理的,我真的很感激伪代码帮助我更好地理解。谢谢,这是有道理的,我真的很感激伪代码帮助我更好地理解。