c - 使用 fgets() 从文件复制到字符串的隔离错误



我有一个文本文件,其中包含以下日期,时间,小时,日期:

AAAA RRR RRR RRR 1111111111111111 2222222222222222AAAA RRR RRR RRR 3333333333333333 4444444444444444BBBB RRR RRR RRR 5555555555555555 6666666666666666BBBB RRR RRR RRR 6666666666666666 7777777777777777中交 ....

aaaabbbb是即 0001 0002等,rrr行无关紧要,11...1122...22等是日期和时间,即 2005-11-03 04:50 .

所以,我有 3 个错误定位的字符串数组:

  • 啜饮aaaabbbb等。
  • 11..11133..33等的STD(一线(
  • ETD 用于22..22244..44等(二线(

我想做的是存储:

  • 所有不同的AAAA,啜饮中的BBBB[number_of_them]
  • 性病11...11[number_of_them]
  • ETD的44...44[数量]

注意:例如 --> aaaa 在 sip[0] 中,11...11 在 std[0] 中,44...44在 etd[0] 中。

每次aaaa变为bbbb,依此类推 --> bbbb 为 sip[1],55...55 更改为 std[1],77...77 更改为 etd[1]

不幸的是,某些东西导致我的代码中出现段错误:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
main () {
    char** sip = malloc(count*sizeof(char*));            // Array for storing flight combinations
    for (i=0; i<count; i++) sip[i] = malloc(5);
    char** std = malloc(count*sizeof(char*));            // Array for storing starting time and date
    for (i=0; i<count; i++) std[i] = malloc(17);
    char** etd = malloc(count*sizeof(char*));            // Array for storing ending time and date
    for (i=0; i<count; i++) etd[i] = malloc(17);
    char* temp = malloc(5);     // Temporary string for passing over irrelevant charactersf
    int a=0, lines = 1;
    char str[2];
    FILE *fp = fopen("test.txt", "rb");{
        while (!feof(fp)) {
            fgets(sip[a],  5, fp);                // SP is stored
            fgets(std[a], 14, fp);                // Pass over irrelevant characters
            fgets(std[a], 17, fp);                // STD is sotred
            fgets(etd[a],  2, fp);                // Pass over irrelevant characters
            fgets(etd[a], 17, fp);                // Temporary ETD is stored
            fgets(temp, 3, fp);                   // Pass over newline
            fgets(temp, 5, fp);                   // SP is stored to check if it has changed
            while (strcmp(temp, sip[a]) == 0) {   // Check if SP has changed
                fgets(etd[a], 16, fp);            // Irrelevant characters
                fgets(etd[a], 16, fp);            // Irrelevant characters
                fgets(etd[a++], 17, fp);          // Correct ETD is stored here, starting from 31st character
                fgets(temp, 3, fp);               // Pass over newline
                fgets(temp, 5, fp);               // SP is stored to check if it has changed
            }
        }
    }
printf(" %s n %s n %s n ", sip[0], std[0], etd[0]);        // Printf to check result    
}

示例文本文件如下所示:

0021 918 ATH SKG 2011-11-02 20:00 2011-11-02 20:550021 901 SKG ATH 2011年11月3日05:00 2011年11月03日05:550022 518 她 2011年11月20日20:00 2011年11月02日20:500022 501 她 2011年11月3日05:00 2011年11月03日05:500023 325 蔡爱 2011年11月2日22:50 2011年11月03日00:450023 326 蔡阿特 2011年11月3日01:45 2011年11月03日03:450024 301 ATH TLV 2011年11月2日23:15 2011年11月03日01:100024 302 TLV ATH 2011年11月3日04:00 2011年11月3日06:100025 530 ATH CHQ 2011年11月1日03:50 2011年11月01日04:400025 531 CHQ ATH 2011年11月1日05:20 2011年11月1日06:100026 175 ATH SKG 2011年11月1日07:05 2011年11月1日08:000026 175 SKG MUC 2011-11-01 08:40 2011-11-01 10:450026 176 MUC SKG 2011年11月1日11:35 2011年11月1日13:350026 176 SKG ATH 2011年11月1日14:15 2011年11月1日15:10

预期的答案是:

0021 2011-11-02 20:00 2011-11-03 05:550022 2011-11-02 20:00 2011-11-03 05:500023 2011-11-02 22:50 2011-11-03 03:450024 2011-11-02 23:15 2011-11-03 06:100025 2011-11-01 04:40 2011-11-01 06:100026 2011-11-01 07:05 2011-11-01 15:10

试一试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void die(const char *msg) {
    fprintf(stderr, "Error: %s.n", msg);
    exit(EXIT_FAILURE);
}
int main() {
    char line[256];
    FILE *fp = fopen("test.txt", "r");
    if (fp == NULL) die("Can't open file");
    // Count the number of unique first values.
    int count = 0;
    char sp[5], sp_last[5] = {0};
    while (fgets(line, sizeof line, fp)) {
        sscanf(line, "%4s", sp);
        if (strcmp(sp, sp_last) != 0)
          ++count;
        strcpy(sp_last, sp);
    }
    rewind(fp);
    char (*sip)[5]  = malloc(count * sizeof(*sip));
    char (*std)[17] = malloc(count * sizeof(*std));
    char (*etd)[17] = malloc(count * sizeof(*etd));
    char etd_in[17];
    if (fgets(line, sizeof line, fp) == NULL)
        die("Can't read first line");
    for (int i = 0; i < count; ++i) {
        if (sscanf(line, "%4s %*s %*s %*s %16c", sip[i], std[i]) != 2)
            die("Can't scan line (a)");
        std[i][16] = '';
        while (fgets(line, sizeof line, fp)) {
            if (sscanf(line, "%4s %*s %*s %*s %*16c %16c", sp, etd_in) != 2)
                die("Can't scan line (b)");
            etd_in[16] = '';
            if (strcmp(sp, sip[i]) == 0)
                strcpy(etd[i], etd_in);
            else
                break;
        }
    }
    for (int i = 0; i < count; ++i)
        printf("%s %s %sn", sip[i], std[i], etd[i]);
    free(sip);
    free(std);
    free(etd);
    return 0;
}

我能建议一个问题(至少(在这里吗:

char** sip = malloc(count*sizeof(char*));            // Array for storing flight combinations
for (i=0; i<count; i++) sip[i] = malloc(5);
char** std = malloc(count*sizeof(char*));            // Array for storing starting time and date
for (i=0; i<count; i++) sip[i] = malloc(17);
char** etd = malloc(count*sizeof(char*));            // Array for storing ending time and date
for (i=0; i<count; i++) sip[i] = malloc(17);

你分配了三个字符串数组sipstdetd,但你只初始化sip的元素,每个数组三次。第二个for循环可能应该初始化std,第三个循环应该初始化etd

相关内容

  • 没有找到相关文章

最新更新