【问题标题】:Home made concatenate function自制连接功能
【发布时间】:2018-11-26 13:45:14
【问题描述】:

我正在尝试用 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++;
    }
}

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

【问题讨论】:

  • myStrCpymyStrCat 都无法复制(或写入)字符串终止符。他们应该返回一个值,但不要。它们也都是低效的:myStrLen 只需要调用一个,而不是在每个循环迭代中。
  • 感谢您的回答,现在可以使用了 :)
  • 除了将空终止符添加到目标字符串的末尾之外,您的代码还多次调用 myStrLen,每次循环都会再次迭代字符串。这是非常低效的。你应该弄清楚如何摆脱这些额外的调用。
  • 正如@WeatherVane 所说,我将连接函数修改为不在循环中调用 myStrLen 而在之前

标签: c string concatenation c-strings


【解决方案1】:

正如@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';
}

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

【讨论】:

    【解决方案2】:

    不确定这是不是答案,但您的复制或连接例程似乎都没有在输出字符串的末尾写“\0”。您可以通过在长度检查中使用

    【讨论】:

    • 我同意只计算一次索引值的风格,因为它使代码清晰。然而,这不是绝对的,因为现代 c 编译器会优化你草率的编码(当然,除非你关闭优化)。顺便说一句,我看到的修改后的代码似乎仍然没有将终止的 0 复制到输出字符串。
    • 感谢您的留言,我做的修改似乎更好?我在字符串末尾添加了 '\0' ...
    猜你喜欢
    • 2013-02-19
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2018-10-31
    • 2012-10-18
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多