我正在尝试将一个包含5000个名称的文件读入C中的二维数组中,其格式如下:
"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET"
此刻,它只是给了我"分段错误:11"。我试图在每个名称中读取它自己的2D数组,但我无法弄清楚如何做到这一点。到目前为止,这是我的代码:
//initialise array and chars
char names[5000][10] = {""};
int i;
char separator = ',';
char ch;
//open file
FILE *namesToBeSorted;
namesToBeSorted = fopen(argv[1], "r");
int j = 0;
//find file size
fseek(namesToBeSorted, 0L, SEEK_END);
int fileSize = ftell(namesToBeSorted);
rewind(namesToBeSorted);
//read from file into array
for (i = 0; i < fileSize; i++){
fscanf(namesToBeSorted, "%c", &ch);
while(ch != separator)
names[i][j] = ch;
fscanf(namesToBeSorted, "%c", &ch);
j++;
}
//print array
for (i = 0; i<5; i++){
for(j = 0; j < 10; j++){
printf("%c\n", names[i][j]);
}
}
感谢任何帮助。
答案 0 :(得分:0)
我会尝试通过评论和我自己的一些意见来总结这些问题......
names
中的每个字段都需要比最长名称长一个字符。如果您事先知道最大尺寸,只需硬编码即可。否则,您需要确保读取的字符数不超过插入字符串的缓冲区。让我们把它留给另一个问题;硬代码很大(例如128代替10),稍后进行优化。
您缺少尖括号以限定while(ch!=separator)
的正文范围。 C与缩写与作用域相同的Python不同。
scanf
可用于提取字符串的一部分。不需要自己迭代每个角色。不确定这是否有效但它应该跳过一个字符("
),然后提取字符直到出现"
,跳过,
,然后重复直到所有名称都被提取出来:< / p>
while(fscanf(namesToBeSorted, "\"%s\",", names[i++])); // terminates when fscanf fails to extract a name, see fscanf doc about its return value
i--; // adjusting counter. hacky hacky
scanf
是你的朋友。使用此解决方案,不需要fileSize
。
打印字符串而不是字符。否则,您将打印未设置为短于最大值的字符的字符。另外,如果打印单个字符串并自动想要换行,最好使用puts
:
while(i--) puts(names[i]);