【问题标题】:Not working / with own Strncpy function不工作/使用自己的 Strncpy 函数
【发布时间】:2013-05-17 16:18:19
【问题描述】:

我有一个自己的函数的问题,应该根据字符的数量将 str2 复制到 str1。

char * strncpy_own(char * str1, char * str2, int c)
{
    int i;
    for( i = 0; i < c; i++, str1++, str2++ )
    {
        *str1 = *str2;
    }

    *(str1 + 1) = '\0';

    return str1;
}

请帮助,当它启动时它立即终止并说:CLearningsss 已停止工作(我的项目名称)。

【问题讨论】:

  • 你要确保size of str1 &gt;= strlen(str2) + 1不会写入垃圾内存,然后使用mallocstr1分配内存
  • "C 代码中不能做什么"
  • 你试过在调试器中单步执行吗?另外,请考虑发布Short, Self-Contained, Compilable Example
  • 为什么不从strlen(str2) 获取字符数,而不是使用c
  • 在向我们展示之前,请确保您的最小测试用例是可编译的。继续编写您的最小的、可编译的测试用例,它会产生症状并在完成后提供给我们。确保它有一个 main 入口点并且是可编译的。我真的不能这么说......你会惊讶于有多少人忘记让他们的测试用例最小化可编译。你已经有了minimal,现在专注于compilable

标签: c string pointers strncpy


【解决方案1】:

应该是

*str1 = '\0';

因为它已经增加了。

简化版

while (c-- > 0) *str1++ = *str2++;

您可以很容易地看到,当c1 时,*str1 得到*str2 的值,并递增,因此str1 指向之后刚刚的值放。因此直接使用str1指针来设置最后的0来表示字符串的结尾可以写成

while (c-- > 0) *str1++ = *str2++;
*str1 = 0;

(实际上'\0'表示char值为零,因此直接写0也可以)

另外,(感谢@Guillaume_Morin 提到)该函数应该更好地返回一个指向结果字符串(str1)开头的指针,并且您需要保留初始str1 的副本为此,因为它稍后会增加:

char * strncpy_own(char * str1, char * str2, int c) {

    char *str1copy = str1;

    while (c-- > 0) *str1++ = *str2++;
    *str1 = 0;

    return str1copy;
}

【讨论】:

  • 好答案。我要补充一点,strncpy 应该返回原始的 str1。这里的代码返回一个指向 nul 字符的指针。
  • 谢谢!我如何在程序中尝试它,以便我可以看到它有效?我一直在尝试 puts(strncpy_own(char *,char *,c));我还尝试使用字符和字符串 %c %s 编写 printf ,但它似乎不起作用。
【解决方案2】:

你提前为str1和str2分配内存了吗?每个字符串需要 c + 1 个字节; c + 2 用于变异字符串,因为您有另一个答案指出的错误;-)

【讨论】:

  • 不,我没有,我还没有开始学习分配内存之类的,但我可能会在几周内学会:)。
  • 您需要先了解这一点,然后您的代码才能运行。谷歌malloc
  • 哦,好吧,你!问题是,在我的书中,我在第 11 章等等。它是关于字符串的。一个练习告诉我为 srncpy 创建一个自己的函数,但下一章是关于 malloc 如何为堆分配内存,我猜是空闲内存等等。
  • 同时阅读 Kernighan 和 Ritchie; C圣经
  • 哦,好吧,但如果我想继续快速学习 C++,我不应该继续完成这本书,然后从 C++ 开始吗?
【解决方案3】:
char *strncpy_my(char *str1, char *str2, size_t size){
    char *ret = str1;
    while(size>0){
        if(*str2=='\0')break;
        *str1++ = *str2++;
        --size;
    }
    while(size>0){
        *str1++ = '\0';
        --size;
    }
    return ret;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多