K&R:练习1-18。程序输入但不会产生任何输出?

问题描述 投票:0回答:1
是我写的一个函数,应该从字符串中删除所有尾部空白。它完成的方式是需要一个字符阵列,并将其复制到另一个字符串,同时还删除了所有尾随的空白。现在,我只是在练习的“尾随空白”部分上工作,因为一旦我做到这一点,就不难实施其余部分。

当使用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

返回类型的值。您不应将该函数的返回值存储在a
int
中,因为取决于您使用的平台,
c getchar
1个回答
0
投票

数据类型

char
可能无法表示值
char
您可能无法将值与有效字符代码的值区分开。

仅在确定
    EOF
  • 没有返回值
    EOF
    .
    的情况下,将
    getchar
  • 的返回值存储在
  • char
    中才是安全的。
    
    请参阅以下问题以获取更多信息:

为什么必须将用于保存getchar返回值的变量称为int?

要解决此问题,您要做的就是将数据类型从
getchar
更改为
EOF
.
另一个问题是,尚不清楚您的字符串是否应为无效。线

c

表示您的字符串应为null终止,因为

char转换格式规范需要事实。但是,在您的函数int

中,您没有在字符串的末端写一个空字符,而仅使用单独的变量跟踪字符串的长度。

如果您不希望您的字符串被终止终止,那么您必须在调用

printf("%s\n", new_line);
时指定字符串的长度,例如:
%s
在此示例中,

getline
是字符串的长度,您正在指示最多要打印20个字符。

,但是,如果您正在关注K&R书籍,我想您应该使用零终端的字符串。在这种情况下,您的函数

printf
必须在字符串的末端写入null字符。
其他问题是,在您的功能中,线

printf("%.*s\n", 20, new_line);
错误。如果要初始化
20

printf

,则必须使用
getline

分配操作员而不是
remove_trailing_blanks
比较操作员。 如果您有适当的警告级别,则您的编译器应警告您。如果您没有从编译器那里得到这样的警告,那么我建议您阅读此信息:

为什么我应该始终启用编译器警告?
这也将告诉您如何将编译器的警告级别设置为适当的级别。
对此进行修复应该解决您未能输出的问题。我将其余的留给你。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.