我有两个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;
}
答案 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)
将源字符串的副本追加到目标字符串。目标中的终止空字符将被第一个字符覆盖 源的字符,并在末尾包含一个空字符 由目的地中的两个串联形成的新字符串。
您可以使用std::string
获得所需的结果。
答案 3 :(得分:1)
函数strcat
具有签名char *strcat( char *dest, const char *src )
,并在src
指向的字符串末尾附加字符串dest
的内容,即更改< / em> dest
指向的内存的内容。这要求dest
点的内存足够大,以容纳字符串src
和dest
。
因此,您的调用strcat(b,a)
实际上会产生未定义的行为,因为b
表示的内存块能够容纳14个字节(即"hey kammo DJ "
+ 1的长度),但不是任何额外的字符串。
所以你宁愿写一些像:
strcpy (c,b);
strcat (c,a);
或:
snprintf(c, 50, "%s%s", b, a);