【问题标题】:Why isn't this code to copy two strings working in C?为什么这段代码不能在 C 中复制两个字符串?
【发布时间】:2010-11-06 04:17:56
【问题描述】:
#include <stdlib.h>

main()
{
    char string[23] = "2345,";

    char aString [sizeof string];

    int i = 0;

    while((aString[i] = string[i]) != ',')
        ++i;

    char *ts = aString;

    printf("%s\n", aString);
}

我想将除逗号之外的所有内容从字符串复制到字符串。但是,这是行不通的 - 我得到了 aString 打印出来的逗号和一些垃圾。谁能告诉我我在这里做错了什么?

好的,结果很好。但是,编译后出现此错误:

警告:内置函数“printf”的隐式声明不兼容

据我所知,我没有对 printf 做任何错误。有谁能告诉我这是怎么回事?

【问题讨论】:

  • 避免警告#include &lt;stdio.h&gt;

标签: c string


【解决方案1】:

需要在while循环后加一次aString[i]=0,C字符串以0结尾。

【讨论】:

  • 0?或 '\0' ?零被认为是空的吗?
  • @user287745: 0'\0' 是一回事('\0' 是空字符,恰好等于0)。
【解决方案2】:
while((aString[i] = string[i]) != ',')
++i;

aString[i] = '\0';

【讨论】:

    【解决方案3】:

    在您没有复制的字符串末尾有一个“不可见”的空字节。 这就是像printf 这样的函数如何知道字符串的结尾在哪里。没有它,printf 将在您的字符串末尾运行并继续打印恰好跟随您的字符串存储的内存中的任何字符。

    在 C 和 C++ 中,所有字符串都应该以这种方式以 null 结尾。

    如果只复制字符串的一部分,则需要手动将空字节添加到末尾:

    while((aString[i] = string[i]) != ',')
        ++i;
    
    string[i] = '\0';    
    

    【讨论】:

    • 除非他只想复制到逗号。
    【解决方案4】:

    您正在使用 while 循环 while((aString[i]=String[i])!=',')++i; 其中=!= 具有更高的优先级,因此首先它将char 从String[i] 复制到aString[i],然后检查条件,即它发生的原因......

    【讨论】:

      【解决方案5】:

      字符串需要以空字符结尾,因此解决问题的方法是在要复制的最后一个字符之后添加空字符。您的代码还有其他几个问题。考虑如果第一个字符串没有逗号(或空终止字符,就此而言)会发生什么。您将获得缓冲区溢出,因为您没有对要复制到的数组进行任何边界检查。这是引入安全错误的一种非常经典的方法。您应该确保您的目标数组足够大以容纳原始数组加上空终止字符的空间,并确保您没有超过目标缓冲区的末尾。

      #include <stdlib.h>
      
      main()
      {
          char string[23] = "2345,";
      
          int buflen = sizeof(string);
      
          char aString [buflen+1];
      
          int i = 0;
      
          while(i < buflen && (aString[i] = string[i]) != ',')
              ++i;
      
          aString[i] = '\0';
      
          char *ts = aString;
      
          printf("%s\n", aString);
      }
      

      您可能已经知道这一点,但您通常只使用strncpy 而不是为此编写代码。

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2017-10-14
        • 2012-03-23
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多