所以,我编写了这个程序,它接收一个字符串作为输入,该字符串由姓氏和姓名组成,写得像这样:"james:lebron"。程序应该将姓氏复制到结构体的姓氏变量中,名称也是如此。没有编译错误,只有核心转储错误。有人能解释一下为什么吗?
#include <stdio.h>
#include <string.h>
struct author{
char *name;
char *surname;
};
typedef struct author author_t;
author_t separate(char *string);
int main(void){
char *name_surname;
printf("Inserisci nome e cognome: ");
gets(name_surname);
separate(name_surname);
}
author_t separate(char *string){
int i, n=0;
author_t temp;
for(i=0; i<(strlen(string)-1); i++){
while(string[i]!=':')
n++;
strncpy(temp.surname, string, n);
strncpy(temp.name, &string[n+2], (strlen(string)-n-2));
}
return(temp);
}
我想说,增加n不是一个好主意,因为n是要复制的项目数,而不是字符串中的位置。
struct author{
char *name;
char *surname;
};
....
int i, n=0;
author_t temp;
for(i=0; i<(strlen(string)-1); i++){
while(string[i]!=':')
n++;
strncpy(temp.surname, string, n);
strncpy(temp.name, &string[n+2], (strlen(string)-n-2));
}
您无法复制到tmp.s姓氏或temp.name中,因为您尚未保留任何内存。(注意,strncpy
不保留内存,它只是复制。)char *name
只为指针保留空间,而不是实际字符串。用户char name[30]
左右,或稍后分配内存,如下所示:
author_t auth;
auth.name = (char *) malloc(30);
(当然,姓氏也是如此)