字符串到字符的转换错误

string to character conversion error?

本文关键字:转换 错误 字符 字符串      更新时间:2023-10-16

在尝试了大约1个小时后,我的代码没有工作,原因是:

void s_s(string const& s, char data[10])
{
    for (int i = 0; i < 10; i++)
        data[i] = s[i];
}
int main()
{
    string ss = "1234567890";
    char data[10];
    s_s("1234567890", data);
    cout << data << endl;//why junk
}

我只是不明白为什么cout在char数组之后显示垃圾。有人能解释一下为什么以及如何解决吗?

您需要null终止您的char数组
std::cout.operator<<(char*)使用来知道在哪里停止
顺便说一下,你的char[]衰变为char*

看这里。

如前所述,您希望NUL终止您的数组,但需要考虑其他事项:

如果s是源字符串,那么您希望循环到s.size(),这样您就不会循环超过源字符串的大小。

void s_s(std::string const& s, char data[20])
{
    for (unsigned int i = 0; i < s.size(); i++)
        data[i] = s[i];
    data[s.size()] = '';
}

或者,你可以试试这个:

std::copy(ss.begin(), ss.begin()+ss.size(),
  data);
data[ss.size()] = '';
std::cout << data << std::endl;

您只为数据分配了10个字节

字符串实际上是11个字节,因为在的末尾有一个隐含的''

您至少应该将数据大小增加到11,并更改循环以复制''以及

您试图在main的最后一行中使用的函数std::ostream::operator<<将以char数组为指针,并打印每个char,直到找到null sentinel字符(该字符为)。

这个sentinel字符通常是在定义了C字符串文字的语句中为您生成的:

char s[] = "123";

在上面的例子中,sizeof(s)4,因为实际存储的字符是:

'1', '2', '3', ''

在需要对const char*字符串的每个字符进行循环的任务中,最后一个字符是基本字符,因为循环终止的条件是必须读取

在您的示例中,您看到的"垃圾"是内存中0字符字节后面的字节(解释为char)。这种行为显然是未定义的,可能会导致程序崩溃。

一种解决方案显然是在char数组的末尾添加 char(当然是固定大小)。

不过,最好的解决方案是永远不要对字符串使用const char*。您在示例中正确地使用了std::string,这将防止出现此类问题和其他许多问题。

如果您需要const char*(例如用于C API),您可以始终使用std::string::c_str并检索std::string的C字符串版本。

您的示例可以改写为:

int main(int, char*[]) {
    std::string ss = "1234567890";
    const char* data = ss.c_str();
    std::cout << data << std::endl;
}

(在这个特定的例子中,已经定义了采用std::stringstd::ostream::operator<<版本,所以您甚至根本不需要data