为什么在使用strcat函数后原始字符串改变了?

时间:2017-06-07 09:51:53

标签: c++ strcat

我有两个char数组。当我尝试使用strcat函数连接两个字符串时。 然后我的字符串“a”长度从9减少到6。 我也丢失了我的字符串“a”.string b也改变了。见输出。为什么会发生这种情况?

这就是我所做的

private BackgroundWorker bgw = new BackgroundWorker();

private void btnSearch_Click(object sendoer, RoutedEventArgs e)
{
    bgw.WorkerReportsProgress = true;
    bgw.ProgressChanged += ProgressChanged;
    bgw.DoWork += DoWork;
    bgw.RunWorkerCompleted += BGW_RunWorkerCompleted;

    bgw.RunWorkerAsync();
}

private void DoWork(object sender, DoWorkEventArgs e)
{
    // Thread.Sleep(5000);
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM " + MyTableName, conn))
        {
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        myDataGrid.Items.Add(new
                        {
                            Id = rdr.GetInt32(0),
                            Name = rdr.GetString(1).ToString(),
                        });
                    }));
                }
            }
        }
    }
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   // Paste code from DoWork and uncomment Thread.Sleep(5000)
}

private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}

输出: -

#include <bits/stdc++.h>

using namespace std;
int main() {
    char a[]="roomies!!";
    char b[]="hey kammo DJ ";
    char *c;
    c=new char[50];
    cout<<"before:-\n";
    cout<<"len of a is "<<strlen(a)<<'\n';
    cout<<"len of b is "<<strlen(b)<<'\n';
    cout<<"len of c is "<<strlen(c)<<'\n';
    cout<<"string a is = "<<a<<'\n';
    cout<<"string b is = "<<b<<'\n';
    cout<<"string c is = "<<c<<'\n';
    c=strcat(b,a);
    cout<<"\nafter:-\n";
    cout<<"len of a is "<<strlen(a)<<'\n';
    cout<<"len of b is "<<strlen(b)<<'\n';
    cout<<"len of c is "<<strlen(c)<<'\n';
    cout<<"string a is = "<<a<<'\n';
    cout<<"string b is = "<<b<<'\n';
    cout<<"string c is = "<<c<<'\n';
return 0;
}

4 个答案:

答案 0 :(得分:3)

根据strcat spec

  

“如果目标数组不大,则行为未定义   足够src和dest的内容和终止null   字符“。

您的目标数组是“b”,显然不足以存储“a”和“b”的内容,因此您得到了一个未定义的行为,导致修改了“a”字符串。

答案 1 :(得分:2)

strcat()将源字符串附加到目标字符串并返回目标字符串。

char * strcat ( char * destination, const char * source ); 

所以你的陈述

c = strcat(b,a) 

因此数组b和c将具有相同的值。 strcat()

编辑: &#34;&#34;改变了,因为你已经溢出了&#34; b&#34;阵列。从它的c ++开始,你可以使用std::string而不是字符数组。

std::string a = "hi" ; 
std::string b = "this is concat" ;
std::string c = a + b ;

答案 2 :(得分:1)

strcat on C++ reference

  

将源字符串的副本追加到目标字符串。目标中的终止空字符将被第一个字符覆盖   源的字符,并在末尾包含一个空字符   由目的地中的两个串联形成的新字符串。

您可以使用std::string获得所需的结果。

答案 3 :(得分:1)

函数strcat具有签名char *strcat( char *dest, const char *src ),并在src指向的字符串末尾附加字符串dest的内容,即更改< / em> dest指向的内存的内容。这要求dest点的内存足够大,以容纳字符串srcdest

因此,您的调用strcat(b,a)实际上会产生未定义的行为,因为b表示的内存块能够容纳14个字节(即"hey kammo DJ " + 1的长度),但不是任何额外的字符串。

所以你宁愿写一些像:

strcpy (c,b);
strcat (c,a);

或:

snprintf(c, 50, "%s%s", b, a);