【问题标题】:Error while writing strcat() using pointers使用指针编写 strcat() 时出错
【发布时间】:2013-08-31 15:51:13
【问题描述】:

我正在尝试通过The C programming Language by K&R 学习 C。我正在尝试使用指针编写strcat() 程序。

char *strcat (char *s, char *t){
    char *d;
    d = s;
    while(*s++);
    s--;
    while(*s++ = *t++);
    return d;
}

int main () {
    char *name1;
    char *name2;
    name1 = "stack" ;
    name2 = "overflow";
    printf("%s %s\n", name1, name2);
    printf("strcat out : %s", strcat(name1, name2));
    return 0;
}

但我得到的输出为

stack overflow
Segmentation fault

为什么它不起作用?任何人都可以在这里澄清错误..

【问题讨论】:

标签: c++ c arrays pointers kernighan-and-ritchie


【解决方案1】:

因为指针是指向文字的指针,而不仅仅是那些 只读 目标不足以容纳两个字符串。对于至少string1,您需要使用一个至少足够大的数组来包含两个字符串(包括终止符)。喜欢:

char string1[128] = "Stack";

char string1[128];
strcpy(string1, "Stack");

【讨论】:

  • 那么我应该在这个程序中做些什么修改呢?
  • @noufal 在我的回答中。
  • 我在网上发现我们需要像char *name1 = malloc(100*sizeof(char));这样声明。但这也不起作用..
  • @noufal 这也不正确,因为您稍后将指针分配为指向文字字符串,这使您失去了malloc 返回的原始指针。相反,您需要将文字字符串 top copy 到数组中。请查看我的更新答案。
【解决方案2】:

程序尝试将字符附加到文字字符串"stack"。不要那样做;创建一个足够大的字符数组来保存结果,将第一个字符串复制到数组中,然后将strcat 字符串的其余部分复制。

哦,将您的函数命名为 strcat 以外的名称。该名称已被占用。

【讨论】:

    【解决方案3】:

    在这一行:

    while(*s++ = *t++);
    

    您取消引用 s,它指向 char 数组 "stack" 的末尾。这会导致segmentation fault 错误。

    【讨论】:

    • while(*s++); 之后是s--;
    • 可以有一个指向数组末尾的指针。正如@johnchen902 所说,一旦找到结尾,代码就会递减指针。
    • 谢谢,我已经改进了我的答案
    【解决方案4】:
     char *name1;
     char *name2;
     name1 = "stack" ;
     name2 = "overflow";
    

    ==>

     char name1[20];
     char name2[10];
     memcpy(name1,"stack") ;
     memcpy(name2,"overflow");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2018-03-27
      相关资源
      最近更新 更多