简单字符串处理sprintf

时间:2014-03-26 10:01:52

标签: c++ string printf

我无法相信我无法做到这一点!有人请帮忙! 这个单词在没有被初始化的情况下被使用(这是必需的吗?):

int main(int argc, char* argv[])
{
    char* word;
    sprintf(word,"%d",12);
    std::cout << word;

    return 0;
}

如果我这样做,它会给DEBUG ASSERTION FAILED!:

int main(int argc, char* argv[])
{
    char* word = NULL; // char* word = nullptr;
    sprintf(word,"%d",12);
    std::cout << word;

    return 0;
}

我已经包含了stdio.h标头。我是如何摸索这一点的,这是没有意义的。

3 个答案:

答案 0 :(得分:2)

您需要使用已分配的内存对其进行初始化。

char word[20];

char* word = new char[20];

将其初始化为NULL将使其在函数尝试写入此地址时崩溃。不初始化它也将是未定义的行为,因为地址将是垃圾。

答案 1 :(得分:1)

这些代码段都是未定义的行为

在第一个中,指针word未初始化,因此其值是不确定的(并且似乎是随机的),因此在使用写入数据时,您不知道 where 它将被写入。

第二个将始终写入地址零,这也是未定义的行为。


解决这个问题的方法是记住你使用的是 C ++ ,它有std::string

std::string word;
word = "12";

或者,如果您将数字作为要使用的整数,请查看std::ostringstream

int value = 12;

// ...

std::ostringstream os;
os << value;

std::string word = os.str();

答案 2 :(得分:0)

你宣称word为指针:什么? 如果您需要字符串,并且仍想使用sprintf,则必须声明其长度:

char word[20]; // twenty bytes including string terminator \0

这种固定长度的语法容易出错并且现在已经过时了:请参考@Joachim Pileborg答案,以便更好地使用C++中的字符串