使用fgets()尝试在两行为空时停止我的程序

时间:2017-10-21 21:23:52

标签: c fgets lines

基本上我做了一个读取两行的短程序,如果它们不同,它会写两个。如果thery是相同的句子,程序应只写一个句子。程序应该在遇到两个空行时停止。这是一个问题。我无法弄清楚如何去做。我已经尝试过使用strcmp()函数但是它也没有用。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char sent1[6000], sent2[6000];

    while(1){

    fgets(sent1, sizeof(sent1), stdin);
    fgets(sent2, sizeof(sent2), stdin);

    if(strcmp(sent1, sent2)!=0)
        printf("%s%s", sent1, sent2);
    else
        printf("%s", sent1);

    if((sent1[0] == '/0') && (sent2[0] == '/0'))
        break;

    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

您的行不为空,因为fgets()会在换行符中读取'\n')。因此,您需要检查换行符号。

if((sent1[0] == '\n') && (sent2[0] == '\n'))
    break;

不再那么相关了,但你的比较是错误的,因为空字符是'\0',而不是'/0'

如前所述,如果缓冲区中有空格,fgets()将读取换行符。在你的情况下,既然你在比较它们,你需要意识到这一点。可能还需要删除换行符。如,

char *p;
if ((p = strchr(sent1, '\n')) != NULL)
    *p = '\0';

(与sent2相同)

要考虑的另一个案例是fgets()调用失败的情况。您需要检查其失败的返回值。失败时fgets()返回NULL。

答案 1 :(得分:0)

fgets读取包含新行字符的行。因此,如果您的文件包含空行,则此行可能位于'\n' 0,而不是'\0'

尝试:

if( ((sent1[0] == '\0') || (sent1[0] == '\n'))
   && ((sent1[0] == '\0') || (sent1[0] == '\n')) )

此外,请注意,您应该检查fgets的返回值,如果已到达文件末尾,则为NULL。在这种情况下,sent1sent2不会再被更改,您可能会遇到无限循环。