下面的代码和示例csv文件。
我写的程序是一个csv阅读器。在while循环中,我将文件的行作为字符串获取,然后使用sscanf我提取存储在局部变量中的数据。
我有两个字符串,我存储在char * name和char * surname中,但它们碰巧有相同的地址:
Printing description of name:
(char *) name = 0x000000010004da78 "Bob"
Printing description of surname:
(char *) surname = 0x000000010004da78 "Bob
我不明白为什么因为它们有不同的变量名。
我希望能回答这个问题,但这不是我的问题:Temporary C strings have same address
我重命名了变量并重新构建了.exe(使用Xcode),但问题仍然存在。知道为什么会出现这个问题吗?
由于
代码
void readFileTest(FILE* *pFile, TTest* *pRootTest)
//Reads the content of the file, line by line
{
int count=0;
char string[MAX_SIZE];
TTest *pTestCurrent=NULL, *pPrevious=NULL;
//Reads first line (wich is the label line)
fgets(string, MAX_SIZE, *pFile);
printf("Column labelling : %s\n", string);
//allocating pointer
pTestCurrent=malloc(sizeof(TTest));
pTestCurrent->ID=0;
pTestCurrent->name="";
pTestCurrent->surname="";
pTestCurrent->mean=0.0;
pTestCurrent->pNext=NULL;
pTestCurrent->pPrevious=NULL;
(*pRootTest)=pTestCurrent;
pPrevious=pTestCurrent;
//Extracts data of each line and stores it in a node
while(fgets(string, MAX_SIZE, *pFile)) //reads line by line until the EOF
{
int identification=0;
char* name;
char* surname;
float mean=0.0;
//Counts iterations (lines) in the file
count+=1;
printf("Iteration n°%d\n", count);
//Extracts data of the line in variables
sscanf(string, "%d,%[^,],%[^,],%f", &identification, name, surname, &mean);
//Assign data in variables to node in pTestCurrent
pTestCurrent->ID=identification;
pTestCurrent->name=name;
pTestCurrent->surname=surname;
pTestCurrent->mean=mean;
//Displays data in node
printf("Line content (stored in pTestCurrent) :\nID : %d\nNAME : %s\nSURNAME : %s\nMEAN : %f\n\n", pTestCurrent->ID, pTestCurrent->name, pTestCurrent->surname, pTestCurrent->mean);
if(pTestCurrent==NULL)
{
printf("ERROR : pointer pTestCurrent is NULL, the programm will exit now\n");
EXIT_FAILURE;
}
//Refresh pointer
pTestCurrent->pNext=malloc(sizeof(TTest));
pTestCurrent=pTestCurrent->pNext;
pTestCurrent->pPrevious=pPrevious;
pTestCurrent->pNext=NULL;
pPrevious=pTestCurrent;
}
};
示例文件:
ID,NAME,SURNAME,MEAN
1,Smith,Bob,4.32
2,Mason,Jack,9.21
3,Gabe,John,2.67
答案 0 :(得分:2)
这里的问题是,在while
循环内,您使用了未初始化的指针。这些指针不能保证指向有效的任何地方,并且您正在尝试通过它们访问内存位置指针。这会导致undefined behavior
解决方案:在将它们作为参数传递给sscanf()
之前,您需要确保它们指向一些可由您的进程访问的有效内存。
答案 1 :(得分:1)
你犯了两个错误:
sscanf
您不会复制扫描的值。
第一个:
sscanf(string, "%d,%[^,],%[^,],%f", &identification, name, surname, &mean);
此处name
和surname
只是指向char的指针,但它们并不指向程序的内存(它们未经初始化并且可以指向任何位置。可能会出现分段错误)。而是,做:
char name[64], surname[64]; // or any proper size for the names
您现在拥有sscanf
的有效内存。
其次,当您将扫描的数据复制到结构中时,必须在结构中为数据分配内存。仅使用pTestCurrent->name=name;
,您可以在结构的名称字段中将指针放置到name
,但不要复制数据。因此,在您的下一个sscanf
,您将只覆盖数据。而是,做:
pTestCurrent->name= malloc(strlen(name)+1);
strcpy(pTestCurrent->name, name);