Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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
C++ 在C中修改char*字符串_C++_C - Fatal编程技术网

C++ 在C中修改char*字符串

C++ 在C中修改char*字符串,c++,c,C++,C,我有这个: char* original = "html content"; 并希望插入一个新的 char* mycontent = "newhtmlinsert"; 在“原件”的标记前面插入上面的“原件” 我的新原著是: char* neworiginal = "html content before </body>" + "newhtmlinsert" + "html content after </body>"; 最后…如何正确计算memcpy中的“end”参

我有这个:

char* original = "html content";
并希望插入一个新的

char* mycontent = "newhtmlinsert";
在“原件”的
标记前面插入上面的“原件”

我的新原著是:

char* neworiginal = "html content before </body>" + "newhtmlinsert" + "html content after </body>";
最后…如何正确计算memcpy中的“end”参数

这里是使用字符串

的C++版本
char *insert = strstr(_in_mem_msg_ptr->buff(), "</body>");//get pointer to </body>
string ad_data = string(_in_mem_msg_ptr->buff(),insert - _in_mem_msg_ptr->buff()) ;//insert the part of _in_mem_msg_ptr->buff() before the </body>
ad_data.append(ad_content); //add the new html content 
ad_data.append(_in_mem_msg_ptr->buff(),insert- _in_mem_msg_ptr->buff(),_in_mem_msg_ptr->dataLen()); //remainder of _in_mem_msg_ptr->buff() from and including </body> to the end
char*insert=strstrstr(_in_mem_msg_ptr->buff(),“”)//获取指向
string ad_data=string(_in_mem_msg_ptr->buff(),insert-_in_mem_msg_ptr->buff())//将_in_mem_msg_ptr->buff()中的部分插入
附加(广告内容)//添加新的html内容
ad_data.append(_in_mem_msg_ptr->buff(),insert-_in_mem_msg_ptr->buff(),_in_mem_msg_ptr->dataLen())//_mem_msg_ptr->buff()的剩余部分,从开始到结束

您需要使用
strcat()
解决此问题

范例=

/* strcat example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

确保要将字符串添加到的任何缓冲区都有足够的空间,以免导致缓冲区溢出。

您需要使用
strcat()
解决此问题

范例=

/* strcat example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

确保将字符串追加到的任何缓冲区都有足够的空间,以免导致缓冲区溢出。

C++没有字符*字符串的+运算符。您需要使用std::string,即

std::string neworiginal = "html content before </body>";
neworiginal += "newhtlminsert";
neworiginal += "..."
std::string neworiginal=“之前的html内容”;
neworiginal+=“newhtlminsert”;
neworiginal+=“…”

C++没有字符*字符串的+运算符。您需要使用std::string,即

std::string neworiginal = "html content before </body>";
neworiginal += "newhtlminsert";
neworiginal += "..."
std::string neworiginal=“之前的html内容”;
neworiginal+=“newhtlminsert”;
neworiginal+=“…”
看看,然后

确保
char
数组足够大,可以容纳连接的字符串。例如,您可能需要执行以下操作:

char neworiginal[1024];
等等。

看看,然后

确保
char
数组足够大,可以容纳连接的字符串。例如,您可能需要执行以下操作:

char neworiginal[1024];

等。

字符串.h函数
strcat
将连接两个字符串,但是当没有足够的空间容纳新字符串时,它将失败。我的解决方案是制作您自己的strcat版本:

char* myStrCat(const char* str1, const char* str2)
{
    char* result;
    char* itr1;
    char* itr2;

    if (str1 == NULL || str2 == NULL)
    {
        return NULL;
    }

    result = (char*)malloc(sizeof(char) * (strlen(str1) + strlen(str2) + 1));   

    itr1 = result;
    itr2 = (char*)str1;

    while (*itr2 != '\0')
    {
        *itr1 = *itr2;
        itr1++;
        itr2++;
    }

    itr2 = (char*)str2;

    while (*itr2 != '\0')
    {
        *itr1 = *itr2;
        itr1++;
        itr2++;
    }

    *itr1 = '\0';

    return result;
}

这有点难看,但它完成了任务:)

字符串。h函数
strcat
将连接两个字符串,但是当没有足够的空间容纳新字符串时,它将失败。我的解决方案是制作您自己的strcat版本:

char* myStrCat(const char* str1, const char* str2)
{
    char* result;
    char* itr1;
    char* itr2;

    if (str1 == NULL || str2 == NULL)
    {
        return NULL;
    }

    result = (char*)malloc(sizeof(char) * (strlen(str1) + strlen(str2) + 1));   

    itr1 = result;
    itr2 = (char*)str1;

    while (*itr2 != '\0')
    {
        *itr1 = *itr2;
        itr1++;
        itr2++;
    }

    itr2 = (char*)str2;

    while (*itr2 != '\0')
    {
        *itr1 = *itr2;
        itr1++;
        itr2++;
    }

    *itr1 = '\0';

    return result;
}

这有点难看,但它完成了任务:)

假设
char*original
由两部分组成,一部分从0开始,另一部分(后面的html内容)从
x开始,您可以使用
strcat
memcpy

int length = strlen(original)+strlen(newcontent)+1;
char *neworiginal = malloc(sizeof(char)*length);
memset(neworiginal, 0, length);
memcpy(neworiginal,original,x*sizeof(char));
strcat(neworiginal,newcontent);
strcat(neworiginal,original+x);

假设
char*original
由两部分组成,一部分从0开始,另一部分(后面的html内容)从
x开始,您可以使用
strcat
memcpy

int length = strlen(original)+strlen(newcontent)+1;
char *neworiginal = malloc(sizeof(char)*length);
memset(neworiginal, 0, length);
memcpy(neworiginal,original,x*sizeof(char));
strcat(neworiginal,newcontent);
strcat(neworiginal,original+x);

试图修改字符串文字的内容会导致未定义的行为

您需要分配一个目标缓冲区(作为自动变量或使用
malloc
),该缓冲区足够大,可以容纳最终字符串和0终止符

此外,您可能希望使用
sprintf
使生活更轻松,例如

sprintf(result, "%s before %s - %s - %s after %s", original, 
    tag, mycontent, original, tag);

试图修改字符串文字的内容会导致未定义的行为

您需要分配一个目标缓冲区(作为自动变量或使用
malloc
),该缓冲区足够大,可以容纳最终字符串和0终止符

此外,您可能希望使用
sprintf
使生活更轻松,例如

sprintf(result, "%s before %s - %s - %s after %s", original, 
    tag, mycontent, original, tag);


这就是你使用的密码吗?因为如果是这样,您将无法添加到原始的
(内存不足)。使用<代码> MalOC/<代码>。哪种语言,C或C++?请仅用一个标记。
C
C++
?看来你想让我看代码< >代码>,但是你能澄清吗?这将是更容易编写的:<代码> STD::String ,最后输出为<代码> char */COD> >如果这是C++,最好使用STD::String。这是你使用的确切代码吗?因为如果是这样,您将无法添加到原始的
(内存不足)。使用<代码> MalOC/<代码>。哪种语言,C或C++?请仅用一个标记。
C
C++
?看来你想让我看代码< >代码>,但是你能澄清吗?这将是很容易的,用<代码> STD::String 最后输出为<代码> char */Cord> >如果你是C++,最好是使用STD::String。当然,如果他没有分配足够的内存,这将不起作用。@拉夫+ 1 -正在思考同样的事情。最好将字符串的总长度和malloc@Rafe:正确,添加的语句反映了这一点。当然,如果他没有分配足够的内存,这将不起作用。@Rafe+1-也在想同样的事情。最好将字符串的总长度和malloc@Rafe:正确,声明补充说,他说他使用C而不是C++:D@Marino但是他确实包含了C++标签……这是一个过时的答案:现在这是一个过时的答案:他说他使用的不是C + C++:D@Marino但是,他确实包含了C++标签……此后已经被删除了:现在这是一个过时的答案:不是strCat。哎呀,我只是在回忆。。。修正:)
sizeof(char)
正好是1,保证。@Ben是的,我知道,但我只是想确保在需要时永远不会忘记sizeof,所以我总是把它放在函数名不是
strCat
的地方。哎呀,我只是在回忆。。。修正:)
sizeof(char)
精确为1,保证。@Ben是的,我知道,但我只是想确保在我需要它时永远不会忘记sizeof,所以我总是把它放在这个声音中,对吗?我在这里使用C++字符串char *插入=STRSTR(μINMIMSMGGPTPT->缓冲区),“/”);获取指向字符串ad_data=string(_in_mem_msg_p)的指针