C:从函数返回一个字符串?

时间:2016-01-19 15:56:33

标签: c string function return

所以我有这个函数从1到13取一个值并返回一个字符串。

const char *valueName(const int valueNum)
{
    switch (valueNum) {
    case 1: return  "Ace";
    case 2: return  "Two";
    case 3: return  "Three";
    case 4: return  "Four";
    case 5: return  "Five";
    case 6: return  "Six";
    case 7: return  "Seven";
    case 8: return  "Eight";
    case 9: return  "Nine";
    case 10: return  "Ten";
    case 11: return  "Jack";
    case 12: return  "Queen";
    case 13: return  "King";
    }

    return "(invalid suit)";
}

这个函数没有任何问题,但我的老师说多个return语句是不好的做法所以我应该使用开关将字符串分配给变量并返回它。但是我似乎无法弄清楚如何做到这一点。我需要使用指针吗? 根据我的老师的说法,这应该是一个简单的解决方法,但无论我尝试它不会工作。

提前致谢!

P.S不要求积分或其他什么,但请不要仅仅因为它对你来说是显而易见的;我还是个初学者。

3 个答案:

答案 0 :(得分:8)

您可以简单地使用字符串数组:

const char *valueName(int valueNum) {
  static const char * const names[] = { "(bad)", "Ace", "Two", ...};
  if (valueNum<1 || valueNum>13) valueNum=0;
  return names[valueNum];
}

如果您真的想要const int参数,那么:

const char *valueName(const int valueNum) {
  static const char * const names[] = { "(bad)", "Ace", "Two", ...};
  return names[(valueNum<1 || valueNum>13)? 0 : valueNum];
}

答案 1 :(得分:5)

对我来说很好看。 (但是对于nitpick,请注意,你并没有真正返回字符串,而是指向const指向空终止只读数组char的第一个元素的指针峰)

由于您不需要break语句,因此也可以阅读。

但有些人喜欢每个功能只有一个return可以帮助调试。如果您需要使用变量,请使用以下内容:

const char *valueName(const int valueNum)
{
    const char* foo;
    switch (valueNum) {
    case 1: 
        foo = "Ace";
        break;
    ...
    default:
        foo = "(invalid suit)";
        break;
    }
    return foo;
}

请注意,指针将指向只读内存。不要试图修改其内容。

继续,您可以使用字符串文字的数组,并返回一个元素。但要注意任何索引都在这样一个数组的范围内:

const char *valueName(const int valueNum)
{
    static char* names[] = {"(invalid suit)", "Ace", ...};
    return names[(valueNum < 0 || valueNum > 13) ? 0 : valueNum];
}

答案 2 :(得分:1)

该功能可以写得更简单

const char * valueName( size_t valueNum )
{
    static const char *suit_names[] = 
    {
        "(invalid suit)", "Ace", "Two", "Three", "Four", "Five", "Six", 
        "Seven",, "Eight", "Nine", "Ten", "Jack", "Queen", "King"
    };

    const size_t N = sizeof( suit_names ) / sizeof( *suit_names );

    return valueNum < 1 || valueNum >= N ? suit_names[0] : suit_names[valueNum];
}