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;
}