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

这给了我一个没有转换错误的指针。真的不知道从这里做什么。

4

2 回答 2

1

根据您的评论,定义MapMarker是这样的:

struct MapMarker {
    float latitude;
    float longitude;
    char markerName[100];
};

在这种情况下,markerName作为 的成员存在MapMarkermarkeName不是指向字符串的指针,而是字符串本身(固定长度为 100 个元素)。

MapMarker如果您使用的是 C,那么您将不得不使用 strcpy,并且如果您在堆上分配实例,请确保您正确处理实例:

char* stationName = getStationName( stationInfo[k].stationID );
strcpy( &mapInfo[k].markerName, stationName );

我将在我的答案后加上一个可怕的警告,以避免 C 风格的字符串处理函数,因为它们是不安全的 wrt:缓冲区溢出(例如,如果stationName超过 100 个字节怎么办?并且不要忘记空终止符)。

于 2013-11-12T01:22:26.373 回答
0

这个问题有很多解决方案。

如果你知道站名的最大长度,你的结构可能有

struct MapMarker {
...

char markerName[MAX_STATION_NAME_LENGTH];
} ;

然后你可以 strcpy (mapInfo[k].markerName, returned_str);


如果您现在没有最大长度,那么您可以将其设置为 strdup:

mapInfo[k].markerName = strdup(returned_str); (markerName 需要是一个字符 *)

但是你需要正确地释放它。


如果你有 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;
}

希望这可以帮助

于 2013-11-12T01:27:48.800 回答