【问题标题】:C++ Append character to std::string from intC++ 将字符从 int 追加到 std::string
【发布时间】:2012-06-15 06:50:18
【问题描述】:

我从键盘输入了一个字符,按整数:

int c = getch();

只有当它不是 return 时,我才想将它附加到字符串中:

void somefunction()
{
    std::string str = "you pressed: ";
    int c;
    while ( 1 )
    {
        c = getch();
        if ( c == 10 ) break;
        char* ch;
        sprintf(ch,"%c",c);
        str += std::string(ch);
    }
}

但是,当离开somefunction 的范围时,这会产生分段错误。我猜想当 str 的 dtor 被调用时,指向 ch 的指针不再可用。

我该如何解决这个问题?

【问题讨论】:

  • 你的问题是指针ch没有初始化,可以指向任何地方。
  • 发生分段错误是因为您实际上没有为字符数组sprintf打印分配任何内存。
  • 您的另一个问题是您将 C 风格的字符串操作与其 C++ 风格混合在一起。当然,这是可以做到的,但不是必要且不重要的(如 sstn 所示)。
  • 段错误是因为 sprintf 正在写入随机数据。将 char *ch; 更改为 char ch[2]; - 但实际上,在答案中使用任何正确的 std::string 方法...
  • 奇怪的是,当我注释掉str += ... 行时,没有发生段错误,让我相信ch 初始化已正确完成。

标签: c++ string pointers scope append


【解决方案1】:

这比你想象的要容易得多:

str.push_back(c);

【讨论】:

  • @Nawaz 你为什么这么说?
  • @JamesMcLaughlin:哦……我误以为是+ 而不是+=
  • stringstream 可能是这里感兴趣的另一类。
【解决方案2】:

您遇到了分段错误,因为您试图将sprintf 字符串放入未知(尚未分配)的内存:

char* ch;
sprintf(ch,"%c",c);

您的代码的可能修复方法是将char* ch; 替换为char ch[2];,这将导致ch 成为具有自动存储持续时间的静态分配数组。

但请注意,由于您使用 C++ 进行编程,因此使用 std::string 的流和方法比使用 C 风格 (char*) 字符串和 C 风格函数(如 sprintf)更明智。

【讨论】:

  • +1。实际上这是一个完整的答案,因为它解释了段错误的原因。
猜你喜欢
  • 2013-02-11
  • 2018-01-12
  • 2012-05-17
  • 1970-01-01
  • 2023-03-06
  • 2017-09-19
  • 2018-04-25
相关资源
最近更新 更多