【问题标题】:Converting integers into a char* c++将整数转换为 char* c++
【发布时间】:2012-11-27 21:32:42
【问题描述】:

这是我的函数,“Sprite”是程序中的一个对象,“GetSpriteAtPosition”只是返回一个指向坐标处正确精灵的指针。

我的问题是我在每个精灵中存储了一个字母,以整数的形式。 0 是 a,25 是 z,分别介于两者之间。我需要我的函数返回一个 char*,它给我一行精灵的字母,所以如果在程序中精灵拼出“abcdefgh”,那么这就是我需要这个函数打印出来的。有一个 8x8 的精灵网格,我得到了正确的坐标,但是我得到一个错误,我无法在标记的行中将 int 转换为 char*。我该怎么做才能让它发挥作用?

提前致谢!

char* RowLetters(int row)
{
    char* pointer;
    for( int i = 0; i < 8; i++)
    {
        Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
        if(selectedSprite != NULL)
        {
            char* temp = (char)(selectedSprite->Frame() + 97); //error here
            pointer = strcat(pointer, temp);
        }
        else
        {
            pointer = strcat(pointer, "test");
        }
    }
    return pointer;
}

【问题讨论】:

  • 也许你想转换成 char* , **(char)**(selectedSprite?
  • 你为什么还要在 C++ 程序中使用 C 字符串?使用std::string 并为自己省去很多悲伤。
  • 一些建议,与问题没有直接关系。首先,存储 char 而不是 int。其次,存储你想要的字符,'a''b'等,这样你就不用经历加97的非便携转换了。

标签: c++ string char


【解决方案1】:

试试这个:

        char temp = (char)(selectedSprite->Frame() + 97);
        pointer = strcat(pointer, &temp);

我已将变量更改为标准 char 而不是指针,然后使用 &amp; 运算符传递对 strcat() 的引用。

编辑:

正如 cmets 中所指出的,这不起作用,因为 &amp;temp 不是 NULL 终止的。当我通过执行以下操作编写更多 C 语言时,我曾经解决过这个问题。

        char temp[2];
        temp[0] = (char)(selectedSprite->Frame() + 97);
        temp[1] = '\0';
        pointer = strcat(pointer, temp);

当然,temp 数组可以在 for() 循环之外声明以获得更好的性能(理论上)。

这些都不能解决像pointer 这样的代码从未被声明过的其他问题。我认为对调用函数更广泛的理解是为了确定pointer是应该在这个函数中分配还是由调用者传入。

【讨论】:

  • @Chad:是的,一旦您运行代码,这似乎是个问题。但是,上面的修改至少应该允许它编译,这解决了帖子中的原始问题。
  • 由于&amp;temp 可能不会以空值终止,这也是一个问题。虽然这修复了编译器错误,但它会导致其他类型的不良行为。
  • 编译时错误比运行时错误要好得多。请参阅此相关问题:stackoverflow.com/questions/4834811/…
【解决方案2】:

您编写的代码将具有未定义的行为,因为 pointer 未初始化,并且未指向您已分配的任何有效内存(以保存行中适当长度的字母。

如果这确实是 C++,如您所说,那么您不想从此函数返回 char*,因为这意味着您已经在该函数中分配了一个静态字符串 (yuck),或者您将在该函数中动态分配字符串,调用者必须释放它(恶心)。

这些选项都不理想。

我建议进行一个非常简单的更改以返回 std::string,如下所示:

std::string RowLetters(int row)
{
    std::string pointer;
    for( int i = 0; i < 8; i++)
    {
        Sprite* selectedSprite = SpriteAtPosition(row*50, i * 50);
        if(selectedSprite != NULL)
        {
            pointer.push_back((char)(selectedSprite->Frame() + 97));
        }
        else
        {
            // ???
            // pointer = strcat(pointer, "test");
        }
    }

    return pointer;
}

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2017-10-08
    • 2016-04-30
    • 1970-01-01
    • 2011-08-28
    • 2012-07-01
    相关资源
    最近更新 更多