使用strcat

时间:2016-07-06 07:59:26

标签: c++ string

#include<iostream>
#include<string.h>
using namespace std;
int main()
{

    char p [] = "TEST";
    strcat (p, "VAL");
    cout << p;
    return 0;
}

如果我理解的是正确的,那么像char p [] =“TEST”这样的陈述;将从堆栈中分配空间。当我为这样的字符串调用strcat()时如何调整p []的存储以容纳额外的字符?

最后一个cout打印“TESTVAL”。这样调用strcat是否有效?如果是,这是如何工作的?我的理解可能有问题,但感觉我失去了联系。所以这很容易成为一个愚蠢的问题。请详细说明。

3 个答案:

答案 0 :(得分:8)

未调整存储空间,调用无效,并且代码的行为未定义。

答案 1 :(得分:3)

当你写

protected void btn_redeem_Click(object sender, EventArgs e)
{
    int lol = int.Parse(lbl_TotalPrice.Text,System.Globalization.NumberStyles.Currency);
    double nprice = lol * 0.05;
    int newpoints=0 ;
    if (int.Parse(Session["points"].ToString()) >= 1000)
    {
        double redeem = lol - nprice;
        lbl_TotalPrice.Text = redeem.ToString("C");
         newpoints = int.Parse(Session["points"].ToString()) - 1000;
    }
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HealthDBContext"].ConnectionString);
    conn.Open();
    string queryStr = "UPDATE Users SET Points ='" + newpoints + "'WHERE UserName=" + Session["New"].ToString();
    SqlCommand com = new SqlCommand(queryStr, conn);

    conn.Close();
}

它扩展到

char buffer[] = "some literal";

具有存储char buffer[sizeof("some literal")] = "some literal"; 的确切大小,仅此而已。

当你在当前缓冲区的末尾连接另一个字符串时 - 你写超出数组的边界 - 具有未定义的行为。

另一个问题在C ++中,我们通常使用"some literal"来处理字符串,它会自动为我们调整所有内存。

答案 2 :(得分:2)

p保留5个字符的空间(空终止符为4 + 1)。然后你再添加3个字符,需要8个空格(null为7 + 1)。你没有足够的空间,并将覆盖堆栈。根据您的编译器和构建设置,您可能看不到任何差异,编译器在堆栈变量之间留下空格。在优化的发布版本中,您可能会遇到崩溃。

如果您将代码更改为如此,则应该看到sentinel1&amp; 2不再是0(这取决于编译器哪个将被删除)。

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    int sentinel1 = 0;
    char p [] = "TEST";
    int sentinel2 = 0;
    strcat (p, "VAL");
   cout << p << sentinel1 << sentinel2;


   return 0;
}