我是C编程的初学者,我建立了一个接收字符串"HodHasharon,frozenYogurt,100"
的函数。该函数将字符串切成3个部分,每个部分都是我的City
结构的一个字段。
我想将"HodHasharon"
放入
将城市pcity.name
(城市名称),"frozenYogurt"
放入pcity.popularFood
(受欢迎的食物)并将居民人数(100
)放入pcity.residents
。
当我在函数中调试输出时,输出是正确的,但是当我从main.c
打印时,我得到了一个连接字符串。
例如,当我打印pcity.name
时,我得到的是"HodHashafrozenYod"
而不是"HodHasharon"
,但是如果我以函数printf-> name的身份执行printf,则会得到{{1}的正确输出}
我在做什么错了?
城市结构:
"HodHasharon"
功能:
typedef struct City
{
char *name;
char * popluarFood;
int numberOfPeople;
} City;
来自主站:
City * cutCityData (char *singleLine)
{
City* pcity=(City*)malloc(sizeof(City));
int firstIndex=1;
int endIndex=1;
int checkItarion=0;
while(endIndex<strlen(singleLine))
{//while
while (singleLine[endIndex] != ',')
{//while2
endIndex++;
}//while2
checkItarion++;
char cityDetails[endIndex - firstIndex +1];
memcpy(cityDetails,&singleLine[firstIndex], endIndex);
cityDetails[endIndex - firstIndex] = '\0';
if (checkItarion == 1) {
pcity->name = (char *) malloc(cityDetails);
strcpy(&(pcity->name), cityDetails);
endIndex++;
firstIndex = endIndex;
}
if (checkItarion == 2) {
pcity->popluarFood = (char *) malloc(cityDetails);
strcpy(&(pcity->popluarFood), cityDetails);
endIndex++;
firstIndex=endIndex;
break;
}
}//while
char cityDetails[strlen(singleLine) - firstIndex + 1];
memcpy(cityDetails, &singleLine[firstIndex], sizeof(singleLine-1));
int resdints=atoi(cityDetails);
pcity->numberOfPeople=resdints;
return pcity;
}
答案 0 :(得分:1)
&(pcity->name)
是指针变量的地址。您想将字符串复制到它指向的内存中,而不是复制到指针上。所以改变:
strcpy(&(pcity->name), cityDetails);
到
strcpy(pcity->name, cityDetails);
您还给malloc()
输入了错误的参数。 cityDetails
是一个数组,但参数应为要分配的字节数。所以改变
pcity->name = (char *) malloc(cityDetails);
收件人:
pcity->name = malloc(strlen(cityDetails) + 1);
还需要对填充pcity->popularFood
的代码进行这些更改。
这是错误的:
memcpy(cityDetails, &singleLine[firstIndex], sizeof(singleLine-1));
singleLine
是一个指针,所以sizeof(singleLine-1)
是指针中的字节数,而不是字符串的长度。应该是:
memcpy(cityDetails, &singleLine[firstIndex], endIndex + 1);