我试图读取一个文件文本(input.txt),它包含多行,如A B 120 C B 60 ...
好吧,现在我试图将可能在该文件中重复多次的名称转换为双指针,它们应该只显示一次。在下面的代码中,我得到了一些但我也遇到了分段错误。我不知道自己错过了什么,或者有什么不对。你的任何小帮助都可以帮助我。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
int i=1, state=0, k, dist;
int** myMat;
char *city1, *city2, **matnames;
FILE* p;
city1 = (char*) malloc(sizeof(char));
city2 = (char*) malloc(sizeof(char));
matnames = (char**) malloc(sizeof(char*));
myMat = (int**) malloc(sizeof(int*));
p = fopen(argv[1],"r");
/************************************************************/
matnames[0] = (char*) malloc(sizeof(char));
matnames[1] = (char*) malloc(sizeof(char));
matnames[2] = (char*) malloc(sizeof(char));
matnames[2] = NULL;
fscanf(p, "%s %s %d", city1, city2, &dist);
strcpy(matnames[0],city1);
strcpy(matnames[1],city2);
/************************************************************/
while( fscanf(p,"%s %s %d",city1,city2, &dist) != EOF){
for(k=0; matnames[k]!=NULL; k++){
if( strcmp(matnames[k], city1) != 0){
state++;
}
}
if(state == k){
matnames[k] = (char*) malloc(sizeof(char));
strcpy(matnames[k], city1);
matnames[k+1] = (char*) malloc(sizeof(char));
matnames[k+1] = NULL;
}
state = 0;
for(k=0; matnames[k] != NULL;k++){
if( strcmp(matnames[k], city2) != 0){
state++;
}
}
if(state == k){
matnames[k] = (char*) malloc(sizeof(char));
matnames[k+1] = (char*) malloc(sizeof(char));
strcpy(matnames[k], city2);
matnames[k+1] = NULL;
}
state = 0;
}
return 0;
}
答案 0 :(得分:3)
matnames = (char**) malloc(sizeof(char*));
这里只为一个char*
分配了足够的内存。
然后你正在打电话
matnames[1] = (char*) malloc(sizeof(char));
虽然matnames只为一个char*
提供空间,但matnames[1]
正在尝试访问第二个char *
的空间。
您需要做的是
matnames = (char**) malloc(n * sizeof(char*));
其中n
是您希望在matnames[]
答案 1 :(得分:1)
除此之外,您已为matnames
分配了足够的内存来存储一个 char *
,但您在其中存储了三个值。为matnames[2]
malloc一些内存然后立即用NULL
覆盖malloc指针也没有帮助 - 但这只是内存泄漏,因为你实际上并没有尝试存储任何内容进入*(matnames[2])
。可能还有其他问题,但让我们从最直接的问题开始。
答案 2 :(得分:1)
您可能也对“strdup()”感兴趣:
它将“malloc()”和“strcpy()”组合成一个操作 - 让您免于担心自己是否“正确地”使用了“正确的大小”。
答案 3 :(得分:1)
在C中,表达式sizeof(char)
将始终返回1
。根据定义:sizeof()
可以在许多不同类型的计算机上运行,而不是每个人都使用字节。
因此,您只为每个名称分配一个字节。如果城市名称长度为20个字符,请使用malloc(21)
(不要忘记在字符串中还有空格用于终止'\0'
。
对于(char **)
指针,您应该弄清楚需要存储多少指针,然后乘以sizeof(char *)
。因此,如果您需要存储3个char *
指针,请使用malloc(3 * sizeof(char *))
。