char* getStationName(int stationID) {
if (stationID < 0 || stationID >= MAX_STATIONS || !AllStationNames[stationID])
return "Unknown";
return AllStationNames[stationID];
}
AllStationNames函数在这里:(http://pastebin.com/zmmrUXTM)这是一个字符串数组:
char *AllStationNames[MAX_STATIONS] = {
[1] = "Ian Stewart Complex/Mt. Douglas High School",
[3] = "Strawberry Vale Elementary School",
...
[197] = "RASC Victoria Centre",
[199] = "Trial Island Lightstation",
[200] = "Longacre",
};
我正在尝试输入该整数,并使用此函数检索字符串,然后将其存储到结构中,有点像这样。
MapMarker mapInfo[t];
int k;
for(k=0; k < MAX_STATIONS; k++) {
char* returned_str = getStationName( stationInfo[k].stationID );
mapInfo[k].markerName = returned_str;
}
这给了我一个没有强制转换错误的指针。真的不知道该怎么办。
答案 0 :(得分:1)
根据您的评论,MapMarker
的定义是这样的:
struct MapMarker {
float latitude;
float longitude;
char markerName[100];
};
在这种情况下,markerName
作为MapMarker
的值成员存在,markeName
不是指向字符串的指针,而是字符串本身(带有固定长度为100个元素。)
如果你正在使用C,那么你将不得不使用strcpy,并且如果你在堆上分配它们,还要确保你正确处理MapMarker
个实例:
char* stationName = getStationName( stationInfo[k].stationID );
strcpy( &mapInfo[k].markerName, stationName );
我会用一个直截了当的警告来回答我的答案,以避免C风格的字符串处理函数,因为它们不安全wrt:缓冲区溢出(例如,如果stationName
长于100个字节会怎么样?并且'不要'忘记null终止符。)
答案 1 :(得分:0)
这个问题有很多解决方案。
如果你知道电台名称的最大长度,你的结构可以有
struct MapMarker {
...
char markerName[MAX_STATION_NAME_LENGTH];
} ;
然后你可以strcpy(mapInfo [k] .markerName,returned_str);
如果你现在没有最大长度,那么你可以强制它:
mapInfo [k] .markerName = strdup(returned_str); (markerName需要是char *)
但是你需要正确地释放它。
如果你有c ++选项,你可以使用std :: string
struct MapMarker {
...
std::string markerName;
} ;
在这种情况下,您的代码可以正常工作。
如果您知道您的所有电台名称在执行程序时都是相同的,那么您实际上不需要复制它。
除了你应该使用
const char *,而不是char *
(markerName将是const char *)
根据我对strdup的经验,它在某些系统上有一些内存分配的怪癖......所以你可能想做类似的事情:
char *myStrdup (char *s)
{
char *r = malloc(strlen(s)+1);
strcpy(r, s);
return r;
}
希望这会有所帮助