gpt4 book ai didi

c - strtok 将垃圾插入数组

转载 作者:行者123 更新时间:2023-11-30 21:22:17 27 4
gpt4 key购买 nike

我在 strtok 方面遇到一些问题,我基本上是逐行读取文件,用 strtok 分隔我从文件中获得的数据。然后将其存储到数组中。

我的文件中的一行看起来像这样(我有几行,但想法是相同的)。

文件.txt

3 0 5 0 0 8 0 1 0

我正在执行以下操作

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

int main(void){

FILE* file;
char line[256];
char* data[9];
char* fileName = "file.txt";
file = fopen(fileName, "r");

fgets(line, sizeof(line), file);
char* ptr = strtok(line," ");
int i = 0;

while(ptr != NULL && i<9){
printf("%s",ptr);
data[i] = ptr;
i++;
ptr = strtok(NULL, " ");
}

for(int z = 0; z<i; z++){
printf( "%s", data[z]) ;
};
fclose(file);
}

这给了我输出

3,0,5,0,0,8,0,1,0, (from the printf inside the while)
p��0�,�0�,�,,0,8,0,1,0 (from the data array)

知道发生了什么吗?

编辑:在 txt 文件中添加间距以及输出之间的分隔。 i<9已添加于 while声明(i<8 做到了,所以最后一个数字没有被捕获)。

EDIT2:使用 data[9] 解决了问题而不是data[8] ,作为一个数组,我认为第一个元素是 data[0]data[8]第九个。

上面代码的当前输出:

3,0,5,0,0,8,0,1,0, (From ptr)
3,0,5,0,0,8,0,1,0, (From data array)

最佳答案

首先,您为线路分配的缓冲区太小。使用line[255]甚至更大。接下来,您尝试从数据数组和z<9打印空指针。将导致索引 8 的访问越界因为数据数组中的最后一个条目实际上位于索引 7 。所以最好的解决方案是限制 for循环 i这实际上等于读取数据条目的大小。

for(int z = 0; z<i; z++){
printf( "%s", data[z]);
}

因此,您将仅打印数据数组中的非空条目。

最后但并非最不重要的一点是,由于您的数据数组只能容纳 8 个条目,因此您还需要更改 while 循环以适应此限制(或增加数组的大小):

while (ptr != NULL && i < 8) {
...
}

关于c - strtok 将垃圾插入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772141/

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