-2

我正在做“cat words | sign”(words 是文本文件,sign 是 c 程序)。然而,这似乎产生了一个无限循环。知道如何解决这个问题吗?

以及是什么意思

sign < words | @sort > out

下面是c程序的代码。

int main(){
    char words[80];
    scanf("%s", words);
    printf(words);
    string_sort(words);
    printf(" ");
    printf(words);
    printf("\n");

    while ( words != ""){
            scanf("%s", words);
            printf("%s", words);
            string_sort(words);
            printf("%s", " ");
            printf("%s", words);
            printf("\n");
    }
 }
4

4 回答 4

1

当程序到达 EOF 时,scanf()保持words不变,原因words != ""总是正确的。

而不是测试words,你应该测试feof(stdin)

于 2012-10-14T23:06:01.653 回答
0

当您到达文件末尾时,scanf将找不到单词并返回 0(不更改words数组)。您可以scanf在 while 语句中直接调用为while(scanf("%s", words) == 1)

于 2012-10-14T23:21:16.907 回答
0

在 bash 中,>and<用于重定向文件的输出和输入。所以< words意味着程序将从中读取其标准输入,words> out意味着它将其标准输出写入到out.

|用于连接管道中的两个程序,第一个程序的输出到第二个程序的输入。

所以sign < words | @sort > out运行这两个程序sign@sort. sign从文件中获取其输入words并将其输出发送到@sort程序的输入,而输出@sort到文件out

于 2012-10-14T23:28:40.423 回答
0

这始终适用于char words[80];

words != ""

因为这等价于&words[0] == &""[0]...您只需比较指针 - 一个等于 begin of words,另一个指向字符串字面量""。他们总是不同的。

你可能的意思是:

strcmp(words, "") != 0

要不就:

words[0] != 0
于 2012-10-14T23:39:25.483 回答