gpt4 book ai didi

c - 在C中使用字符串数组的数组来解析文本文件

转载 作者:行者123 更新时间:2023-11-30 17:53:44 25 4
gpt4 key购买 nike

我想从 N 个文本文件中读取(具有相似的结构:几行,每行具有相同的少量单词)并将读取的单词存储在字符串矩阵中,以这样的方式在每个(行, col)位置我有一个词。

文件的简单样本(两行,每行三个单词)如下:

line1word1 line1word2 line1word3
line2word1 line2word2 line2word3

单词的分隔符是空格。

我尝试过这段代码:

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

#define MAX_STRING_LENGTH 1000
#define MAX_TOKS 100
#define DELIMITERS " "

// line parsing utility
int parseString(char* line, char*** argv) {

char* buffer;
int argc;

buffer = (char*) malloc(strlen(line) * sizeof(char));
strcpy(buffer,line);
(*argv) = (char**) malloc(MAX_TOKS * sizeof(char**));

argc = 0;
(*argv)[argc++] = strtok(buffer, DELIMITERS);
while ((((*argv)[argc] = strtok(NULL, DELIMITERS)) != NULL) &&
(argc < MAX_TOKS)) ++argc;
return argc;
}


int main() {

char S[MAX_STRING_LENGTH];
char **A;

int n,i,j,l;

FILE *f;
char file[50];

char ***matrix;
matrix = malloc(MAX_TOKS * sizeof(char**));

//memory allocation for matrix
for (i = 0; i < MAX_TOKS; i++)
{
matrix[i] = malloc(MAX_TOKS * sizeof(char *));
for (j = 0; j < MAX_TOKS; j++)
{
matrix[i][j] = malloc(MAX_TOKS * sizeof(char));
}
}

int NFILE = 10; // number of files to be read

for(i=0;i<NFILE;i++)
{
sprintf(file,"file%d.txt",i);
f = fopen(file,"r");

l=0; // line-in-file index
while(fgets(S,sizeof(S),f)!=NULL) {
n = parseString(S,&A);
for(j=0;j<n;j++) {
matrix[i][l]=A[j];
printf("%s\t%s\n",matrix[i][l],A[j]);
}
l++;
}
fclose(f);
}

free(matrix);
free(A);
return(0);
}

我无法解决的问题是,当使用检查数组之间的对应关系时(为了确保我正确存储单个单词)

printf("%s\t%s\n",matrix[i][l],A[j]);

我发现每行的最后一个单词(并且只有最后一个),无论文件号如何,都没有存储在 matrix 中。 。也就是说line1word1line1wordsfile0正确存储在matrix[0][0][0]中和matrix[0][0][1] ,但在现场matrix[0][0][2]没有line1word3 ,即使A[2]有它!

我做错了什么?有什么建议吗?

提前非常感谢,干杯

最佳答案

char ***matrix没有声明三维数组。您的矩阵需要类似于 char *matrix[a][b]保存字符串指针的二维数组。为了计算数组中的地址,编译器需要知道除一维之外的所有维度。如果你想一想,你可能就会明白为什么......

如果你有两个数组:

1 2 3        1  2  3  4  5  6  7
4 5 6 8 9 10 11 12 13 14
7 8 9 15 16 17 18 19 20 21

您可以看到item[1][1] 不是同一个项目。无论数组中的维度如何,元素通常在内存中按顺序排列,每一行都在前一行(或可能的列,这取决于语言,我想)之后。如果您有一个指针数组,则实际内容可能在其他地方,但点会这样排列。因此,在上面的示例中,您必须向编译器提供列数,以便它可以找到成员(行数可以是可变的。)在三维数组中,您必须提供前两个维度,以便编译器可以计算项目偏移量。

希望对您有所帮助。

编辑:通过创建自己的函数来处理所有数组项访问,您可以拥有真正动态的数组维度。该函数需要知道动态维度和项目索引,以便计算适当的地址。

关于c - 在C中使用字符串数组的数组来解析文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15430285/

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