C:strcpy 的段错误

标签 c string segmentation-fault malloc

我想知道是否有人可以帮助我解决这个段错误,valgrind 和 gdb 指向 strcpy(),但我仍然找不到它..

void listusers(userstat* ptustat)
{
    FILE* fileu = openfile("user_db");
    char* str = (char*) malloc(sizeof(char)*100);
    char* temp = (char*) malloc(sizeof(char)*100);
    int i = 0;
    int offset = 0;
    while (fgets(str,100,fileu) != NULL)
        {   
            strcpy(temp,str);
            strcpy((*(ptustat+i)).name,strtok(temp,"#"));
            offset+=(strlen(temp)+1);
            strcpy(temp,str+offset);
            strcpy((*(ptustat+i)).contact,strtok(temp,"#"));
            offset+=(strlen(temp)+1);
            strcpy(temp,str+offset);
            strcpy((*(ptustat+i)).uname,strtok(temp,"#"));
            offset+=(strlen(temp)+1);
            strcpy(temp,str+offset);
            strtok(temp,"#");
            offset+=(strlen(temp)+1);
            strcpy(temp,str+offset);
            (*(ptustat+i)).saldo = atof(strtok(temp,"\n"));
            i++;
        }
closefile(fileu);
free(str);free(temp);
}

用户统计定义:

typedef struct userstat {
char name[50];
char contact[50];
char uname[50];
float saldo;
} userstat;

它正在读取的文件也有这样的行: 姓名#联系人#用户名#密码#钱

gdb 回溯:

    Program received signal SIGSEGV, Segmentation fault.
__strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
296 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: Ficheiro ou directoria inexistente.
(gdb) bt
#0  __strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
#1  0x00000000004030b2 in listusers ()
#2  0x0000000000401fee in statsmenu ()
#3  0x0000000000401c1d in menuinit ()
#4  0x0000000000400ecc in main ()
(gdb) 

函数的调用和结构体的分配:

void statsmenu()
    {

        char x = '0';

        getchar(); 
        while (1)
            {
                prodstat db[100] = {{"",0.00,0.00,0.00}};
                prodstat *ptstat = db;
                userstat dbu[100] = {{"","","",0.00}};
                userstat *ptustat = dbu;
                listproducts(ptstat);
                listusers(ptustat);

最佳答案

我将笨拙的 (*ptustat + i)).xxx 替换为等效的(但可读)ptustat[i].xxx

现在您对 strtok 的使用是错误且尴尬的。试试这个:

while (fgets(str, 100, fileu) != NULL)
{
    strcpy(temp, str);
    strcpy(ptustat[i].name, strtok(temp, "#"));
    offset += (strlen(temp) + 1);
    strcpy(temp, str + offset);
    char *p = strtok(temp, "#");

    if (p == NULL)   // p can be NULL here
    {
        printf("BUMMER\n");
        exit(1);
    }

    strcpy(ptustat[i].contact, p);
    offset += (strlen(temp) + 1);
    strcpy(temp, str + offset);
    strcpy(ptustat[i].uname, strtok(temp, "#"));
    offset += (strlen(temp) + 1);
    strcpy(temp, str + offset);
    strtok(temp, "#");
    offset += (strlen(temp) + 1);
    strcpy(temp, str + offset);
    ptustat[i].saldo = atof(strtok(temp, "\n"));
    i++;
}

我将修正错误作为练习。

此外(与您的问题无关):

可以替换

char* str = (char*) malloc(sizeof(char)*100);
...
free(str);

char str[100];

动态分配固定空间缓冲区通常是没有意义的。

关于C:strcpy 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43809204/

相关文章:

c - 在 Windows 中构建 go 项目时运行 gcc 失败

c - 如何比较重定向文本文件C中的行数

string - awk åäö 变音字符的长度为 2

sql-server - 获取sql server中重复多次的2个字符之间的字符串

python:按最后一次出现分割字符串似乎是删除它而不是分割它

C、stat() 的问题

c - 在 while 循环中使用 #define

c++ - 将(共享指针的) vector 的值分配给共享指针导致段错误c++

c - 将字符串拆分为 140 个字符 block

c - 在 ANSI C 中将 Int 值序列化到 char* 缓冲区