【问题标题】:strcat function how to usestrcat函数使用方法
【发布时间】:2015-05-30 19:43:00
【问题描述】:

我是 C 语言的新手。我正在尝试使用 strcat,以下示例有效:

  char s1[20] = "Happy ";
  char s2[15] = "world";
  char s3[40] = "";
  strcat(s3,s1);

虽然,我想练习一下我之前看到的指针,所以:

char *s1 = "Happy";
char *s2 = "World";

strcat(*s2,*s1);

产生“char”类型的参数与“const char *”类型的参数不兼容。同样,这可能很容易,但要尽可能明确

【问题讨论】:

    标签: c strcat


    【解决方案1】:

    在第二个例子中,

    strcat(*s2,*s1);
    

    存在类型不匹配问题,因为 *s2*s1 的类型为 char。如果你使用:

    strcat(s2,s1);
    

    还是会出错,因为s2 指向一个字符串字面量,不能修改。

    【讨论】:

    • 等等..为什么s2不能修改?
    • @iol 修改 字符串文字 是未定义的行为。
    • 这取决于s2 的声明方式。如果它是一个字符串,就像你的第二个示例一样,那么是的,它不能被修改。但是,如果它是像您的第一个示例一样放置在堆栈上的字符数组,您可以根据需要对其进行编辑。
    【解决方案2】:

    您遇到困难的原因是因为您通过在s2s1 前面使用* 来取消引用s2s1 中的第一个字符。这就是为什么。

    虽然字符数组不被认为与指向一个或多个字符的指针完全相同,但数组名,我们以s1为例,被认为是指向数组中第一个字符的指针@987654327 @,即'H'。使用名称s2 指向s2 中的第一个字符,即'w'。因此,如果在s2s1 前面加上一个星号,则会分别读取每个数组中的第一个字符。

    因此,正如在另一个答案中所指出的那样,您正在尝试连接两个 8 位字符,而不是将一个字符串连接到另一个字符串的末尾。

    【讨论】:

      【解决方案3】:
      strcat(*s2, *s1);
      

      尝试连接两个 8 位字符而不是两个字符串,这实际上是不可能的。 Strcat 需要两个指向字符串的指针。它的作用是找到第一个字符串的结尾,并开始逐个字符移动第二个字符串,因此结果是一个更长的字符串。

      它被声明为

      char * strcat (char * destination, const char * source);
      

      因此

      char s1[20] = "Hello ";
      char s2[40] = "World!";
      strcat(s2, s1);
      

      是要走的路,因为s2s1 都是指针。

      但是,如果你真的想玩指针,你可以使用

      char* strs[2];
      strs[0] = "Hello ";
      strs[1] = "World!";
      
      char res[20];
      strcat(res, *strs);
      strcat(res, strs[1]);
      

      【讨论】:

      • 我试过了,但我得到访问冲突写入位置 0x0118CC78,
      • @iol 在哪一个?我可能犯了一个错误。另外,我做了一个小修改,看看。
      • 好的,如果你初始化 char res[20] = " " 就可以了。虽然我想做的是 strcat(strs[0],strs[1]) 这似乎不起作用
      • 没关系我的错,我再次阅读了上面的cmets,似乎你不能改变字符串文字的值所以我想这就是为什么我不能做一个strcat( strs[0],strs[1]);
      • 是的,就是这样。现在可以了吗?
      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2019-03-26
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多