如何添加strtok令牌从文件读取到数组?


int main(){
FILE *file;
char line[100];
char name[26],code[4],donator[10],shipment[10], quantity[10];
int count = 0;
file = fopen("donation.txt","r");
if(!file){
printf("File does not exist!");
return 1;
}
while (!feof(file)){
fgets(line,100,file);
count++;
}
char *list[count][5];
memset(list,0,sizeof(list));
fseek(file,0,SEEK_SET);
count=0;
int count2=0;
char dtm[sizeof(line)];
while (!feof(file)){
fgets(line,100,file);
if (count>0){
strcpy(dtm,line);
printf("%s",dtm);
count2=0;
for(char  *p = strtok(dtm,"|");p ; p=strtok(NULL,"|")){
printf("n %d %s",count2,p);
list[count-1][count2]=p;
printf("n%s",list1[count-1][count2]);
count2++;
}
}
count++;
}
for(int i =0; i<count-1 ;i++){
for(int k=0;k<count2;k++)
printf("n%d %d %s",i,k,list[i][k]);
}
fclose(file);
return 0;
}

.

Contactless Thermommeter | CT          | Japan        | 1               | 1                      
Hand Sanitizer           | HS          | USA          | 1               | 1                      
Face Mask                | FM          | China        | 1               | 1                      
Surgical Mask            | SM          | China        | 1               | 1                      
Oxygen Mask              | OM          | Saudi Arabia | 1               | 1                                               

for循环的预期输出代码片段:

0 0 Contactless Thermometer<br/>
0 1  CT<br/>
0 2  Japan<br/>
0 3  1<br/>
0 4  1<br/>
1 0 Hand Sanitizer<br/>
1 1  HS<br/>
1 2  USA<br/>
1 3  1<br/>
1 4  1<br/>

for循环的输出代码片段:
0 0 Oxygen Mask<br/>
0 1  OM<br/>
0 2  Saudi Arabia<br/>
0 3  1<br/>
0 4  1<br/>
1 0 Oxygen Mask<br/>
1 1  OM<br/>
1 2  Saudi Arabia<br/>
1 3  1<br/>
1 4  1<br/>

我在pre-U学习Python后才开始学习C语言,如果这里有人能指导我的代码出了什么问题,我将非常感激。在文件读取过程中,我使用strtok将txt文件中的行分解并存储在list[i][k]中,如如何在数组上的指针中存储令牌(strtok)所示。它显示了预期值,但在下一个for循环中,list[i][k]只显示了最后一组值,如下图所示。

好了,代码有点乱,您只是想将文件映射到2D数组中。

有几个问题:

if (count>0){

为什么?如果你想要数组中的每一行,不要跳过第一行。

list[count-1][count2]=p;

省略-1。这里没有什么可做的。

list[count-1][count2]=p;

对,同一行有两个问题。

在数组中赋值一个指向字符串的指针,该指针会发生变化。还有指针混叠。Strtok返回一个指向实际字符串的指针。它不重新分配内存。

解决方案是简单地将字符串串起来,这样它就有了一个新的内存,在下一个循环周期中不会被改变。

list[count][count2] = strdup(p);

别忘了稍后释放它。不要忘记检查你的strdup是否没有失败:)

其他注意事项:您有未使用的变量。换行符保留在字符串的最后一个记号中。你可能想要删除它

strtok()返回指向原始数组的指针,该数组将被下一个调用fgets()覆盖,因此您应该分配字符串的副本。你可以使用strdup():

list[count][count2] = strdup(p);

还要注意,while (!feof(file))不是测试文件中是否有另一行可用的可靠方法。你应该只调用fgets()并检查返回值:

while (fgets(line, 100, file)) { ...

修改后的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE *file;
char line[100];
char name[26], code[4], donator[10], shipment[10], quantity[10];
int count = 0;
file = fopen("donation.txt", "r");
if (!file) {
printf("File does not exist!");
return 1;
}
/* count the number of lines */
while (fgets(line, sizeof line, file)) {
count++;
}
/* allocate the 2D array of tokens and the per line token counts */
char *list[count][5];
int listlen[count];
/* restart parsing at the beginning of the file */
fseek(file, 0, SEEK_SET);
count = 0;
while (fgets(line, sizeof line, file)) {
count2 = 0;
/* split the line on |, also stripping the trailing newline
* note however that strtok() does not allow for empty tokens */
for (char *p = strtok(line, "|n"); count2 < 5 && p != NULL; p = strtok(NULL, "|n")) {
list[count][count2] = strdup(p);
count2++;
}
listlen[count] = count2;
count++;
}
for (int i = 0; i < count; i++) {
for (int k = 0; k < listlen[count]; k++)
printf("%d %d %sn", i, k, list[i][k]);
}
fclose(file);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新