我有一个文本文件,其中包含以下日期,时间,小时,日期:
AAAA RRR RRR RRR 1111111111111111 2222222222222222AAAA RRR RRR RRR 3333333333333333 4444444444444444BBBB RRR RRR RRR 5555555555555555 6666666666666666BBBB RRR RRR RRR 6666666666666666 7777777777777777中交 ....
aaaa
和bbbb
是即 0001
0002
等,rrr
行无关紧要,11...11
、22...22
等是日期和时间,即 2005-11-03 04:50
.
所以,我有 3 个错误定位的字符串数组:
- 啜饮
aaaa
、bbbb
等。 11..111
、33..33
等的STD(一线(- ETD 用于
22..222
、44..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);
你分配了三个字符串数组sip
、std
和etd
,但你只初始化sip
的元素,每个数组三次。第二个for
循环可能应该初始化std
,第三个循环应该初始化etd
。