当使用GCC(C89)编译时,该程序将获取输入,但不会产生任何输出。这是为什么?我假设这与
getchar()
工作方式有关吗?我不确定
提前(:代码:
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int limit);
void remove_trailing_blanks(char line[], char new_line[], int lenght);
main()
{
int c;
char line[MAXLINE];
char new_line[MAXLINE];
while ((c = getline(line, MAXLINE)) != 0) {
remove_trailing_blanks(line, new_line, c);
printf("%s\n", new_line);
}
return 0;
}
int getline(char line[], int limit)
{
char c;
int i;
for (i = 0; ((c = getchar()) != EOF) && i < limit && c != '\n' ; ++i) {
line[i] = c;
}
if (c == '\n') {
line[i] = c;
++i;
}
return i;
}
void remove_trailing_blanks(char line[], char new_line[], int lim) {
int i, state = 0;
for(i == 0; line[i] != '\0' && i < lim; ++i) {
if (state > 0) {
state = 0;
while (line[i] == ' ') { ++i; }
}
if (line[i] == ' ') {
++state;
new_line[i] = line[i];
}
else {
new_line[i] = line[i];
}
printf("%s\n", new_line);
}
}
函数
getchar
int
中,因为取决于您使用的平台,数据类型
char
可能无法表示值char
,您可能无法将值与有效字符代码的值区分开。仅在确定
EOF
EOF
.的情况下,将
getchar
char
中才是安全的。请参阅以下问题以获取更多信息:
为什么必须将用于保存getchar返回值的变量称为int?
要解决此问题,您要做的就是将数据类型从
getchar
更改为
EOF
.。
另一个问题是,尚不清楚您的字符串是否应为无效。线
c
表示您的字符串应为null终止,因为
char
转换格式规范需要事实。但是,在您的函数int
如果您不希望您的字符串被终止终止,那么您必须在调用
printf("%s\n", new_line);
时指定字符串的长度,例如:%s
在此示例中,getline
,但是,如果您正在关注K&R书籍,我想您应该使用零终端的字符串。在这种情况下,您的函数
printf
必须在字符串的末端写入null字符。其他问题是,在您的功能中,线
printf("%.*s\n", 20, new_line);
错误。如果要初始化
20
到printf
,则必须使用
getline
分配操作员而不是remove_trailing_blanks
比较操作员。
如果您有适当的警告级别,则您的编译器应警告您。如果您没有从编译器那里得到这样的警告,那么我建议您阅读此信息:为什么我应该始终启用编译器警告?
这也将告诉您如何将编译器的警告级别设置为适当的级别。对此进行修复应该解决您未能输出的问题。我将其余的留给你。