Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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++ 在不使用strncpy的情况下添加2个字符?_C++_C - Fatal编程技术网

C++ 在不使用strncpy的情况下添加2个字符?

C++ 在不使用strncpy的情况下添加2个字符?,c++,c,C++,C,如何在不使用strncpy函数的情况下手动连接两个字符数组 我可以说char1+char2 或者我必须为循环编写一个,以获取单个元素并按如下方式添加它们: addchar[0] = char1[0]; addchar[1] = char1[1]; etc etc addchar[n] = char2[0]; addchar[n+1] = char2[1]; etc etc char1 + char2 澄清,如果 char1=“快乐” char2=“生日” 我希望addchar to=happ

如何在不使用
strncpy
函数的情况下手动连接两个字符数组

我可以说
char1+char2

或者我必须为循环编写一个
,以获取单个元素并按如下方式添加它们:

addchar[0] = char1[0];
addchar[1] = char1[1];
etc
etc
addchar[n] = char2[0];
addchar[n+1] = char2[1];
etc
etc
char1 + char2
澄清,如果 char1=“快乐” char2=“生日”

我希望addchar to=happybirthday

仅用于C语言的解决方案:

请注意,strn*系列字符串函数比没有n的更安全,因为它们避免了缓冲区溢出的可能性

<>对于C++解决方案,只需使用STD::String和Talk +或Trase+=:

std::string destination("Hello ");
destination += "World";
destination += '!';

如果你使用C++,只使用<代码> STD::String 。使用<代码> STD::String S,支持<代码> +/>代码>运算符,因此您可以执行String 1+String 2 .< /P> < P>如果您认为两个琐碎的循环为“手动”,则是,不使用标准库,这是唯一的方式。

char *append(const char *a, const char *b) {
    int i = 0;
    size_t na = strlen(a);
    size_t nb = strlen(b);
    char *r = (char*)calloc(na + nb + 1, 1);
    for (i = 0; i < na; i++) {
        r[i] = a[i];
    }
    for (i = 0; i < nb; i++) {
        r[na + i] = b[i];
    }
    return r;
}
char*append(常量char*a,常量char*b){
int i=0;
尺寸=斯特伦(a);
尺寸=strlen(b);
char*r=(char*)calloc(na+nb+1,1);
对于(i=0;i

请记住在不使用库函数的情况下调用
free

,步骤如下:
1.指向string1中的第一个字符。
2.当指针上的当前字符不为空时,递增指针。
3.创建指向string2的“源”指针。
4.当“源”位置的字符不为空时:
4.1. 将字符从“源”位置复制到String1指针指向的位置。
4.2. 递增两个指针

除非这是作业,否则请使用C++ C++代码> STD::String < /代码>。 如果必须使用C样式字符串,请使用库函数。


库函数经过优化和验证,减少了开发时间。

好的,您需要这样的功能:

addchar[0] = char1[0];
addchar[1] = char1[1];
etc
etc
addchar[n] = char2[0];
addchar[n+1] = char2[1];
etc
etc
char1 + char2
首先,让我们看看疯狂的解决方案:

C:

C++:

现在,让我们看看理智的解决方案:

char* StringAdd(char* a_Left, char* a_Right)
{
    unsigned int length = strlen(a_Left) + strlen(a_Right);

    char* result = new char[length];
    strcpy(result, a_Left);
    strcat(result, a_Right);

    return result;
}
那么,这是家庭作业吗?我真的不在乎


如果是,问问自己:你学到了什么?

在什么上加上两个字符?一根绳子?一个字符*?要添加两个字符,您需要将一个或另一个字符强制转换为int,然后将结果存储在int中以避免溢出,但我想这不是您想要的答案。ie
chara='h',b='i';int r=(int)a+b公共服务公告:一种语言的新用户通常没有正确的词汇。因为他没有使用正确的语言而否决这个问题是。。。我的意思是,为什么不使用strncopy呢?什么约束可能会使您处于不想使用它的位置?你是在为硬件编程还是在做作业?也许他是在没有完整C/C++运行时的嵌入式系统上编程。编辑以避免使用strncpy。是否要完全避免使用字符串函数?如果是,请在问题中指出。如果调用者提供已分配的目标缓冲区(及其大小),则会更好(并且与标准库更一致)。一个好的做法是,负责释放内存的人就是负责分配内存的人。“愚蠢的一致性是小头脑的妖怪。”只是开玩笑,只是开玩笑!但老实说,标准库的设计似乎更倾向于CPU的生产率而不是人力。我不喜欢它的接口,选择不传播它们。(除了,
atoi
,该函数还可以。)C及其标准库是在70/80年代资源受限时开发的。C目前的利基仍然处于资源有限的环境中。如果人类的生产力是最重要的,那么还有其他语言比C语言更合适。你有一个缓冲区溢出错误。我可以说我把它留给读者作为练习,但我是在撒谎。
char* StringAdd(char* a_Left, char* a_Right)
{
    unsigned int length = strlen(a_Left) + strlen(a_Right);

    char* result = new char[length];
    strcpy(result, a_Left);
    strcat(result, a_Right);

    return result;
}