gpt4 book ai didi

c - c中的输出问题

转载 作者:太空狗 更新时间:2023-10-29 16:12:13 25 4
gpt4 key购买 nike

make[] 数组给我的输出有问题。所以首先我标记了名为 Carss.txt 的文件,只抓取第三和第五列,并将结果存储在 make[] 数组和 year[] 数组。

我测试了 make[] 数组,看看它是否会输出我想要的结果。它在 while(fgets) 循环内部执行,但是当我在 while(fgets) 外部测试它时,它在重复。

我不明白这是什么问题。下面提供了我的程序和文本文件。

while(fgets) 循环中生成数组的输出:(我想要的)

FORD
FORD
JAYCO

while(fgets) 循环外生成数组的输出:(不是我想要的)

JAYCO
JAYCO
JAYCO

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

int main() {
FILE * fp;
char * filename = "Carss.txt";
char lines[100000], blank[100000];
char * token, * del = " ";
int i = 0, c, d = 0, j;
char * make[10000];
char * year[10000];
if ((fp = fopen(filename, "r")) == NULL) /* Opens the file */ {
printf("can't open %s\n", filename);
exit(1);
}
c = 0;
while (fgets(lines, sizeof(lines), fp) != NULL) {
token = strtok(lines, "\t");
i = 1;
while (i < 5) {
token = strtok(NULL, "\t");
if (i == 2) {
make[c] = token;
}
if (i == 4) {
year[c] = token;
}
i++;
}
printf("%s\n", make[c]); /* OUTPUT OF THE ARRAY HERE IS WHAT I WANTED */
c++;
}
c = 0;
while (c < 3) {
printf("%d\n", c);
printf("%s\n", make[c]);
c++;
}
}

我标记化的文本文件:Carss.txt

1   02V288000   FORD    FOCUS   2001    02S41   ELECTRICAL SYSTEM:BATTERY:CABLES    FORD MOTOR COMPANY  19990719    20010531    V   291854  20030210    ODI Ford Motor Company  20021106    20021106            CERTAIN PASSENGER VEHICLES EQUIPPED WITH ZETEC ENGINES, LOOSE OR BROKEN ATTACHMENTS AND MISROUTED BATTERY CABLES COULD LEAD TO CABLE INSULATION DAMAGE. THIS, IN TURN, COULD CAUSE THE BATTERY CABLES TO SHORT RESULTING IN HEAT DAMAGE TO THE CABLES.  BESIDES HEAT DAMAGE, THE "CHECK ENGINE" LIGHT MAY ILLUMINATE, THE VEHICLE MAY FAIL TO START, OR SMOKE, MELTING, OR FIRE COULD ALSO OCCUR.   DEALERS WILL INSPECT THE BATTERY CABLES FOR THE CONDITION OF THE CABLE INSULATION AND PROPER TIGHTENING OF THE TERMINAL ENDS.  AS NECESSARY, CABLES WILL BE REROUTED, RETAINING CLIPS INSTALLED, AND DAMAGED BATTERY CABLES REPLACED.   OWNER NOTIFICATION BEGAN FEBRUARY 10, 2003.   OWNERS WHO DO NOT RECEIVE THE FREE REMEDY  WITHIN A REASONABLE TIME SHOULD CONTACT FORD AT 1-866-436-7332.    ALSO CONTACT THE NATIONAL HIGHWAY TRAFFIC SAFETY ADMINISTRATION'S AUTO SAFETY HOTLINE AT 1-888-DASH-2-DOT (1-888-327-4236). 000015339000215022000000202
2 02V288000 FORD FOCUS 2000 02S41 ELECTRICAL SYSTEM:BATTERY:CABLES FORD MOTOR COMPANY 19990719 20010531 V 291854 20030210 ODI Ford Motor Company 20021106 20021106 CERTAIN PASSENGER VEHICLES EQUIPPED WITH ZETEC ENGINES, LOOSE OR BROKEN ATTACHMENTS AND MISROUTED BATTERY CABLES COULD LEAD TO CABLE INSULATION DAMAGE. THIS, IN TURN, COULD CAUSE THE BATTERY CABLES TO SHORT RESULTING IN HEAT DAMAGE TO THE CABLES. BESIDES HEAT DAMAGE, THE "CHECK ENGINE" LIGHT MAY ILLUMINATE, THE VEHICLE MAY FAIL TO START, OR SMOKE, MELTING, OR FIRE COULD ALSO OCCUR. DEALERS WILL INSPECT THE BATTERY CABLES FOR THE CONDITION OF THE CABLE INSULATION AND PROPER TIGHTENING OF THE TERMINAL ENDS. AS NECESSARY, CABLES WILL BE REROUTED, RETAINING CLIPS INSTALLED, AND DAMAGED BATTERY CABLES REPLACED. OWNER NOTIFICATION BEGAN FEBRUARY 10, 2003. OWNERS WHO DO NOT RECEIVE THE FREE REMEDY WITHIN A REASONABLE TIME SHOULD CONTACT FORD AT 1-866-436-7332. ALSO CONTACT THE NATIONAL HIGHWAY TRAFFIC SAFETY ADMINISTRATION'S AUTO SAFETY HOTLINE AT 1-888-DASH-2-DOT (1-888-327-4236). 000015339000215021000000202
3 02V236000 JAYCO FT EAGLE 10 SG 2003 EQUIPMENT:OTHER:LABELS JAYCO, INC. 20020730 20020813 V 86 20020923 MFR Jayco, Inc. 20020904 20020912 ON CERTAIN FOLDING TENT CAMPERS, THE FEDERAL CERTIFICATION (AND RVIA) LABELS HAVE THE INCORRECT GROSS VEHICLE WEIGHT RATING, TIRE SIZE, AND INFLATION PRESSURE LISTED. IF THE TIRES WERE INFLATED TO 80 PSI, THEY COULD BLOW RESULTING IN A POSSIBLE CRASH. OWNERS WILL BE MAILED CORRECT LABELS FOR INSTALLATION ON THEIR VEHICLES. OWNER NOTIFICATION BEGAN SEPTEMBER 23, 2002. OWNERS SHOULD CONTACT JAYCO AT 1-877-825-4782. ALSO, CUSTOMERS CAN CONTACT THE NATIONAL HIGHWAY TRAFFIC SAFETY ADMINISTRATION'S AUTO SAFETY HOTLINE AT 1-888-DASH-2-DOT (1-888-327-4236). 000015210000106403000000349

最佳答案

当你这样做时:

token = strtok(NULL, "\t");
if(i==2)
{
make[c] = token;
}

您不获取字符串的副本,只获取对其的指针 引用。然后下次调用 fgets 时,字符串将被覆盖,所有引用都指向新字符串。因此,当您到达程序末尾时,所有指针都指向写入该内存的最后内容。

试试这个:

make[c] = strdup(token);

这将分配新的内存,复制字符串,并返回新的指针。副本不会被覆盖。 strdup 在内部调用 malloc,因此您应该在使用完内存后释放内存。

关于c - c中的输出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26282481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com