尝试将char *函数的返回存储到char数组中

时间:2013-11-12 01:14:50

标签: c

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;
}

这给了我一个没有强制转换错误的指针。真的不知道该怎么办。

2 个答案:

答案 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;
}

希望这会有所帮助