Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
strcat将第二个字符串粘贴到第一个字符串的开头_C_String_Strcat - Fatal编程技术网

strcat将第二个字符串粘贴到第一个字符串的开头

strcat将第二个字符串粘贴到第一个字符串的开头,c,string,strcat,C,String,Strcat,我使用strcat()连接两个字符串,如: #include <string.h> #include <stdio.h> int main(int argc, char *args[]) { char *str1; // "456" char *str2; // "123" strcat(str1,str2); printf("%s",str1); } 但我需要第一个字符

我使用
strcat()
连接两个字符串,如:

    #include <string.h>
    #include <stdio.h>

    int main(int argc, char *args[])
    {
       char *str1; // "456"
       char *str2; // "123"

       strcat(str1,str2);
       printf("%s",str1);
    }
但我需要第一个字符串开头的第二个字符串,如:

123456

我怎么做?

你需要使用
strcpy
而不是
strcat

strcat(str2,str1),切换参数。但您将在
str2
中获得结果字符串,如果您确实想在程序中进一步使用
str1
,可以将其设置为
str1

但是,您需要适当注意
str2
中的可用内存空间


如果要更改str1,请执行此操作

char *tmp = strdup(str1);

strcpy(str1, str2); //Put str2 or anyother string that you want at the begining
strcat(str1, tmp);  //concatenate previous str1

...
free(tmp); //free the memory

来自
man strcat
的逐字记录:

char*strcat(char*dest,const char*src)

描述

函数的作用是:将src字符串追加到dest字符串,覆盖dest末尾的空字节('\0'),然后添加一个终止的空字节。字符串不能重叠,dest字符串必须有足够的长度 结果的空间

作为程序员,您需要确保指针
char*dest
引用了足够的有效内存来保存将从
char*src
指向的位置复制的附加
char
s

要成功地在
str1
前面加上
str2
前缀,请声明如下:

char str2[3 + 1] = "123"; // three for "123" plus 1 for the terminating 0
char str1[2 + 3 + 1] = "46"; // 2 for "46" plus 3 for "123" plus 1 for the terminating zero
要实际连接两个
char
数组,请执行以下操作:

strcat(str1, str2);

尝试将其用于静态大小的阵列,在我的项目中对我有用

void strbeg(char* strReceive, char* strInsert)
{
    int strInsertLength = strlen(strInsert);
    int strReceiveLength = strlen(strReceive);

    for(int i = strReceiveLength; i >= 0; i--)
    {
        strReceive[i + strInsertLength] = strReceive[i];
    }

    for(int i = 0; i < strInsertLength; i++)
    {
        strReceive[i] = strInsert[i];
    }
}
void strbeg(char*strReceive,char*strInsert)
{
int strInsertLength=strlen(strInsert);
int strReceiveLength=strlen(strReceive);
对于(int i=strReceiveLength;i>=0;i--)
{
strReceive[i+strInsertLength]=strReceive[i];
}
for(int i=0;i
您的示例不清楚。什么是字符*str1;//“456”
打算怎么办?它不会生成您显示的输出,但会遇到未定义的行为,因为没有为任何字符分配内存,但是
str1
str2
随机指向某个地方。str1是一个长字符串,我需要在开头添加另一个字符串。我需要在开头添加“”(空白)str1@Refael,检查更新的答案。您可以将其更改为附加尽可能多的字符串。噢,这意味着引用了足够的内存!这在你的例子中并不清楚
strcat()
只是一个伪智能复制函数。它肯定不是“内存区域连接器”!它不会将调用
strdup()
分配的内存附加到
str1
引用的内存中!只有
realloc()
能够扩展已分配内存的区域。@alk,这假设
str1
有足够的内存。
void strbeg(char* strReceive, char* strInsert)
{
    int strInsertLength = strlen(strInsert);
    int strReceiveLength = strlen(strReceive);

    for(int i = strReceiveLength; i >= 0; i--)
    {
        strReceive[i + strInsertLength] = strReceive[i];
    }

    for(int i = 0; i < strInsertLength; i++)
    {
        strReceive[i] = strInsert[i];
    }
}