我在编写函数以从文件中提取字符串时遇到了一些问题,这是一个更大的程序的一部分。一切似乎工作正常,除非我使用memset或bzero擦除我一直在使用的字符数组。我一直坐在这个问题上超过一个小时,无论我做什么,我都会遇到段故障。我为bzero和memset都收到了这个错误。请帮帮我。 我在下面附上我的代码。打印出“add out of addfront”语句,但没有打印出“Done with all bzero”语句。那时我得到了一个分段错误。谢谢
void extractFileData(FILE *fp , char clientName[])
{
char tempFileName[50], tempFilePath[100], tempFileSize[50];
struct stat fileDetails;
while(fgets(tempFileName, sizeof(tempFileName), fp)!= NULL)
{
if((newLinePos = strchr(tempFileName, '\n')) != NULL)
{
*newLinePos = '\0';
}
strcat(tempFilePath, "SharedFiles/");
strcat(tempFilePath, tempFileName);
if(stat(tempFilePath, &fileDetails) < 0)
{
perror("Stat error");
exit(1);
}
//Copy it into a string
sprintf(tempFileSize, "%zu", fileDetails.st_size);
printf("temp file size: %s\n", tempFileSize);
//Add all these details to the file list by creating a new node
addFront(tempFileName, tempFileSize, clientName);
printf("Come out of addfront\n");
memset(&tempFileName, 0, 45);
printf("Done with all bzero\n");
memset(&tempFileSize, 0, sizeof(tempFileSize));
memset(&tempFilePath, 0, sizeof(tempFilePath));
printf("Done with all bzero\n");
}
}
编辑:
void addFront(char fileName[], char fileSize[], char clientName[])
{
FILENODE* n;
printf("Inside add front function\n");
strcpy(n->fileName, fileName);
printf("n->filename: %s\n", n->fileName);
strcpy(n->fileSize, fileSize);
printf("n->filesize: %s\n", n->fileSize);
strcpy(n->ownerName, clientName);
printf("n->ownername: %s\n", n->ownerName);
myFileList.head = n;
printf("Did it go past myfilelist head = n\n");
myFileList.numOfNodes++;
printf("num of nodes: %d\n", myFileList.numOfNodes);
}
我添加了addFront函数的代码。它基本上增加了
结构myFileList
的细节基本上是一个实现
链表。 FILENODE
表示列表中的每个条目。
编辑:
添加我正在使用的结构
struct fileNode
{
char fileName[50];
char fileSize[50];
char ownerName[25];
struct fileNode* next;
};
struct fileList
{
struct fileNode* head;
struct fileNode* tail;
int numOfNodes;
};
typedef struct fileList FILELIST;
typedef struct fileNode FILENODE;
答案 0 :(得分:1)
我不知道为什么你的程序会在那里崩溃。但我可以在程序中出现另一个错误。先修复另一个错误,看看是否还有问题。
错误:
strcat(tempFilePath, "SharedFiles/");
strcat(tempFilePath, tempFileName);
tempFilePath
变量未初始化。这可能巧合没有崩溃,但你不能依赖它不会崩溃。它可能会乱写你的堆栈。
请改为:
snprintf(tempFilePath, sizeof(tempFilePath), "SharedFiles/%s", tempFileName);
最后,没有必要将数组归零。数组的内容不会在下一个循环迭代中使用,所以你也可以忽略它们。
void extractFileData(FILE *fp , char clientName[])
{
char tempFileName[50], tempFilePath[100], *newLinePos;
struct stat fileDetails;
while (fgets(tempFileName, sizeof(tempFileName), fp)) {
if ((newLinePos = strchr(tempFileName, '\n')))
*newLinePos = '\0';
snprintf(tempFilePath, sizeof(tempFilePath),
"SharedFiles/%s", tempFileName);
if (stat(tempFilePath, &fileDetails) < 0) {
perror("Stat error");
exit(1);
}
printf("temp file size: %zu\n", tempFileSize);
addFront(tempFileName, tempFileSize, clientName);
}
}
在{C>这样的工作中,snprintf()
函数确实是第一选择。使用snprintf()
编写“显然不会崩溃”的代码很容易,而代码“不会明显崩溃“。
如果你的代码仍然崩溃,那么其他地方就会出现错误。
答案 1 :(得分:0)
addFront()
在您对其进行任何操作之前需要n = malloc( sizeof *n)
。