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
C 国产串联函数_C_String_Concatenation_C Strings - Fatal编程技术网

C 国产串联函数

C 国产串联函数,c,string,concatenation,c-strings,C,String,Concatenation,C Strings,我正在尝试用C语言创建一个连接函数,我是初学者 但我有一个问题,我的函数只连接第二个字符串的第一个字符,但不适用于所有字符串 例如: String1=“ABCD”和String2=“EFGH”结果将是:String1= “ABCDE” 这是我的代码: int main(int argc, char *argv[]) { char *myChaine1 = (char*)malloc(100); char *myChaine2 = (char*)malloc(100);

我正在尝试用C语言创建一个连接函数,我是初学者

但我有一个问题,我的函数只连接第二个字符串的第一个字符,但不适用于所有字符串

例如:

String1=“ABCD”和String2=“EFGH”结果将是:String1= “ABCDE”

这是我的代码:

int main(int argc, char *argv[]) 
{   
    char *myChaine1 = (char*)malloc(100);
    char *myChaine2 = (char*)malloc(100);

    myStrCpy("ABCD", myChaine1);
    myStrCpy("EFGH", myChaine2); 

    myStrCat(myChaine1, myChaine2);

    printf("%s", myChaine1);

    free(myChaine1);
    free(myChaine2);
    return 0;
}

// Home made string length function
int myStrLen(const char* word)
{
    int length = 0;
    while (word[length] != '\0')
    {
        length++;
    }
    return length;
}

// Home made Copy string function    
char* myStrCpy(const char* word, char* copy)
{
    int i = 0;
    while (i < myStrLen(word))
    {
        copy[i] = word[i];
        i++;
    }   
}

// Home made concatenate function
char* myStrCat(char* chaine1, const char* chaine2)
{
    int i = 0;
    while (i < myStrLen(chaine2))
    {   
        chaine1[i + myStrLen(chaine1)] = chaine2[i];
        i++;
    }
}
intmain(intargc,char*argv[])
{   
char*myChaine1=(char*)malloc(100);
char*myChaine2=(char*)malloc(100);
myStrCpy(“ABCD”,myChaine1);
myStrCpy(“EFGH”,myChaine2);
myStrCat(myChaine1、myChaine2);
printf(“%s”,myChaine1);
免费(myChaine1);
免费(myChaine2);
返回0;
}
//自制字符串长度函数
int myStrLen(const char*word)
{
整数长度=0;
while(单词[长度]!='\0')
{
长度++;
}
返回长度;
}
//自制复制字符串函数
char*myStrCpy(常量char*word,char*copy)
{
int i=0;
而(我

有人知道问题出在哪里了吗?

不确定这是否是答案,但您的copy或concat例程似乎都没有在输出字符串的末尾写入“\0”。您可以使用@WeatherVane建议的来纠正此问题,我将我的功能更改如下:

char* myStrCat(char* chaine1, const char* chaine2)
{
    int i = 0;
    int lastValue = myStrLen(chaine1);
    while (i < myStrLen(chaine2))
    {   
        chaine1[i + lastValue] = chaine2[i];
        i++;
    }
    chaine1[myStrLen(chaine1)] = '\0';
}
char*myStrCat(char*chaine1,const char*chaine2)
{
int i=0;
int lastValue=myStrLen(链1);
而(我

问题在于循环中myStrLen的迭代。

myStrCpy
myStrCat
都无法复制(或写入)字符串终止符。它们应该返回一个值,但不返回。它们也都是低效的:
myStrLen
只需要调用一次,而不是在每次循环迭代中。感谢您的回答,它现在正在工作:)除了在目标字符串的末尾添加空终止符之外,您的代码还多次调用myStrLen,每次通过循环时都会再次迭代字符串。这是非常低效的。你应该弄清楚如何摆脱这些额外的调用。正如@WeatherVane所说,我将连接函数修改为不在循环中调用myStrLen,但在此之前,我同意只计算一次索引值的方式,因为这使代码更清晰。然而,这并不是一个复杂的问题,因为现代c编译器将优化您的草率编码(当然,除非您关闭优化)。顺便说一句,我看到的修改后的代码似乎仍然没有将终止的0复制到输出字符串中。感谢您的消息,通过我所做的修改,似乎更好了?我在字符串末尾添加了“\0”。。。