c - 解析 C 中的管道分隔行

标签 c scanf

我正在加载的文本文件位于下面代码的注释部分。我无法让 sscanf() 像我想象的那样工作。必须有一种方法几乎如此优雅,而不必使用指针、for 循环等来遍历每个字符。

//Apex City Hotel|4|61 Grassmarket|Edinburgh|EH1
//Hilton Edinburgh Airport|4|Edinburgh International Airport|Edinburgh|EH12
//Novotel Edinburgh Centre|4|80 Lauriston Place|Edinburgh|EH3
//Premier Inn Haymarket|3|1 Morrison Link|Edinburgh|EH3
//Premier Inn Lauriston Place|3|82 Lauriston Place|Edinburgh|EH3
//Premier Inn Leith|3|51-53 Newhaven Place - Leith|Edinburgh|EH6
//Sheraton Grand Hotel & Spa|5|1 Festival Square|Edinburgh|EH3
//The Caledonian|5|Princess Street|Edinburgh|EH1
//The Glasshouse|5|2 Greenside Place|Edinburgh|EH1
//The Hilton Edinburgh Grosvenor|4|Grosvenor Street|Haymarket|Edinburgh|EH12

代码:

int main(void)
{
    char inputArray[NUM_OF_CHARACTERS];
    FILE *fp = fopen("OpenChampionshipHotels.txt", "r");
    fgets(inputArray, NUM_OF_CHARACTERS, fp);    

    if (fp == NULL)
    {
        printf("Error Reading File\n");
        exit(1);
    }

    // copy lines from text file to array
    char hotelName[lineCount][NUM_OF_CHARACTERS];
    char hotelRating[lineCount][NUM_OF_CHARACTERS];
    char hotelStreetAddress[lineCount][NUM_OF_CHARACTERS];
    char hotelCity[lineCount][NUM_OF_CHARACTERS];
    char hotelPostalCode[lineCount][NUM_OF_CHARACTERS];

    lineCount = 0;
    while(fgets(inputArray, sizeof(inputArray), fp) != NULL)
    {
        sscanf(inputArray, "%[^|]|%[^|]|%[^|]|%[^|]|%s",
               hotelName[lineCount],
               hotelRating[lineCount],
               hotelStreetAddress[lineCount],
               hotelCity[lineCount],
               hotelPostalCode[lineCount] );

        printf("%s\n", hotelName[lineCount]);
        printf("%s\n", hotelRating[lineCount]);
        printf("%s\n", hotelStreetAddress[lineCount]);
        printf("%s\n", hotelCity[lineCount]);
        printf("%s\n", hotelPostalCode[lineCount]);

        lineCount++;
    }
    fclose(fp);

    return 0;
}

最佳答案

您对sscanf()的使用那里很好。你的问题只是你正在使用 lineCount声明数组的大小,这可能是一个全局变量,因此此时为零。

定义一个常量NUM_OF_LINES并使用它来代替:

char hotelName[NUM_OF_LINES][NUM_OF_CHARACTERS];
char hotelRating[NUM_OF_LINES][NUM_OF_CHARACTERS];
char hotelStreetAddress[NUM_OF_LINES][NUM_OF_CHARACTERS];
char hotelCity[NUM_OF_LINES][NUM_OF_CHARACTERS];
char hotelPostalCode[NUM_OF_LINES][NUM_OF_CHARACTERS];

(您还应该检查 sscanf() 返回 5,以捕获没有正确数量字段的行,并将 lineCount < NUM_OF_LINES 添加到 while() 条件)。

关于c - 解析 C 中的管道分隔行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17435934/

相关文章:

c - 用通用参数包装算法的最安全和最易读的方法?

java - C 服务器到 Java 客户端套接字读取以短值传递

c - SDL2 如何渲染原始格式的像素?

c - 在 C 中将文件中的字符串和整数扫描到数组中

Char 数组指针(通过 'reference' 传递)未分配(sscanf 变量更改后)

c++ - sscanf 无法读取双十六进制

在 C 中创建固定大小的链表

c - 对于多个网格的 FBX 模型,网格未显示在正确的位置

c - 如何用 C 语言完成这个作业?

c - 退出 scanf 使用较少的参数然后指定