写到我在 C 中找到一个空行

Write untill i find an empty line in C

我正在尝试查找一天(星期一、星期二...)的所有数据并将数据写在下面。 我的txt文档是这样写的:

Monday .......
..............
..............

Tuesday.......
..............
..............

Monday........
..............
..............

唯一分隔天数的是一个空行。 我成功地在文件中找到了日期,问题是我需要打印所有数据直到出现空行。 例如,如果我 select 星期一(selectedday="Monday"),我的输出应该是:

Monday .......
..............
..............

Monday .......
..............
..............

我试过的代码:

    int main()
    {
        char string[100], selectedday[] = "monday"; //for Monday
        FILE* openbill;
        openbill= fopen("bill.txt", "r");
        if (openbill== NULL)
        {
            printf("Failed to open bill\n");
            return NULL;
        }
        while (fscanf(openbill, "%s", string) == 1)
        {
            if (strstr(openbill, selectedday) != 0)
            {
                printf("%s", string);
               
            }
        }
    }

感谢您的帮助。

您的代码中存在多个问题。
错误:

  • strstr(char* array1, char* array2) 比较两个字符串 array1array2.
    但是在代码中,您将 openbill (FILE*) 与 selectedday (char*) 进行比较,这将导致错误。

  • 您想在到达空行(string=="\n")时停止阅读信息。
    但是fscanf()不将换行符作为输入,因此跳过任何空的换行符。 read here.

  • 只要达到 spacenewline
  • fscanf 就会停止输入。这意味着它只能读取一个单词,而不是 string(可以包含由 space 分隔的多个单词)

  • 您的字符数组 string 最多可以存储 100 个字符。但是一行可能包含更多的字符,这可能会导致溢出。


可能的解决方案:

  • strstr(string, selectedday) 而不是 strstr (openbill, selectedday).

  • 使用 fgets 而不是 fscanf。它可以读取换行符,因此可以将空行("\n")作为输入。它还通过限制输入的大小来防止溢出。


代码: 空行("\n")的特点是它的长度是1char,而char'\n'.

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

int getSize(char* charArray) //returns the actual size of an char* array.
{
    int size = 0; //size = number of char before '[=10=]'

    while (charArray[size] || charArray[size]!=NULL)
    {
        size++;
    }
    return( size );
}

int main(int argc, char *argv[]){
    char string[100], selectedday[]="monday";
    FILE* openbill;
    openbill= fopen("bill.txt", "r");
    if (openbill== NULL)
    {
        printf("Failed to open bill\n");
        return NULL;
    }
    while (fgets(string, 100 ,openbill )!=NULL)//EOF not reached and a line is read
    {
        if (strstr(string, selectedday) != 0)
        {
            printf("%s", string);
            while (fgets(string, 100, openbill ) && getSize(string)!=1 && string!="\n") //EOF not reached and string is not an empty line.
            {
                printf("%s", string);
            }
            printf("\n");
        }    
    }
    fclose(openbill);
    return 0;
}

示例输入:

..

monday----  -------\n1
d----------------\n2
----------- ---kol

but why?
\n
g

monday  -----------\n1
d-----------  -----\n2

end
g

示例输出:

monday----  -------\n1
d----------------\n2
----------- ---kol

monday  -----------\n1
d-----------  -----\n2

扫描集%2[\n]告诉fscanf最多扫描两个字符并且只扫描换行符。
格式字符串 "%99s" 告诉 fscanf 将最多 99 个非空白字符扫描到 string 中。这为终止零留出了空间。
output 是一个标志,当找到日期时设置为 1 并在扫描一对换行符时设置为 01 启用输出并打印 string

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

void showday ( char *selectedday) {
    char string[100] = "";
    char newline[3] = "";
    int result = 0;
    int output = 0;
    FILE* openbill = NULL;

    openbill = fopen ( "bill.txt", "r");
    if ( openbill == NULL) {
        perror ( "bill.txt");
        return;
    }
    do {
        string[0] = 0;//set empty string
        if ( 1 == ( result = fscanf ( openbill, "%2[\n]", newline))) {
            if ( output) {//enabled
                printf ( "%s", newline);
            }
            if ( '\n' == newline[1]) {//two newlines
                output = 0;//disable
            }
        }
        else {
            result = fscanf ( openbill, "%99s", string);
            if ( strstr ( string, selectedday)) {
                output = 1;//enable
            }
        }
        if ( output && string[0]) {//enabled and string not empty
            printf ( "%s ", string);
        }
    } while ( EOF != result);

    fclose ( openbill);

}

int main ( void) {

    showday ( "monday");

    return 0;
}