代码之家  ›  专栏  ›  技术社区  ›  Alex Xander

如何将char*str复制到c中的char c[]?

  •  9
  • Alex Xander  · 技术社区  · 15 年前

    尝试复制 char *str char c[] 但出现分段错误或初始值设定项错误无效。

    为什么这个代码给了我一个 赛格断层 ?

    char *token = "some random string";
    char c[80];  
    strcpy( c, token);
    strncpy(c, token, sizeof c - 1); 
    c[79] = '\0';
    char *broken = strtok(c, "#");
    
    6 回复  |  直到 9 年前
        1
  •  17
  •   Ólafur Waage    15 年前

    使用 strncpy() 而不是 strcpy()

    /* code not tested */
    #include <string.h>
    
    int main(void) {
      char *src = "gkjsdh fkdshfkjsdhfksdjghf ewi7tr weigrfdhf gsdjfsd jfgsdjf gsdjfgwe";
      char dst[10]; /* not enough for all of src */
    
      strcpy(dst, src); /* BANG!!! */
      strncpy(dst, src, sizeof dst - 1); /* OK ... but `dst` needs to be NUL terminated */
          dst[9] = '\0';
      return 0;
    }
    
        2
  •  2
  •   Paul Mitchell    15 年前
    char *str = "Hello";
    char c[6];
    strcpy( c, str );
    
        3
  •  1
  •   Patrice Bernassola    15 年前

    使用strncpy确保复制的字符数不超过char[]所能包含的字符数。

    char *s = "abcdef";
    char c[6];
    
    strncpy(c, s, sizeof(c)-1);
    // strncpy is not adding a \0 at the end of the string after copying it so you need to add it by yourself
    c[sizeof(c)-1] = '\0';
    

    编辑:添加到问题的代码

    查看您的代码分割错误可能是由行

    strcpy(c, token)
    

    问题是,如果令牌长度大于C长度,那么内存将从C var中填满,这会导致问题。

        4
  •  0
  •   bua    15 年前

    字符c[]必须有一定的大小;

    例如

    char c[]= "example init string";
    

    //设置表C到C[19]; 你可以直接在你的程序中分配它;

    char c[19] = {0}; // null filled table
    

    char c[i]是指针,因此不需要复制任何内容; 字符C[19]; C=“example init string”; //现在&c[0]指向相同的地址;

    复制可以通过以下方式完成

     strcpy(dst, src);
    

    但是微软强迫你使用安全功能:

    strcpy_s(dst,buffsize,src);
    
        5
  •  0
  •   Johan Soderberg    15 年前

    我在C/C++中编码已经有一段时间了,但是C(80)可能是在堆栈上分配的。如果使用char*c和strdup或类似的方法,则会在strtok可以访问的堆上分配它。

    试试这个。

    char *token = "some random string";
    char *c;
    c = strdup(token);
    char *broken = strtok(c, "#");
    free(c);
    
        6
  •  0
  •   dstibbe    15 年前

    编辑: 感谢您添加代码。

    可能SegFault出现在这里:

    strncpy(c, token, sizeof c - 1); 
    

    sizeof的优先级与“-”从右到左的优先级相同,因此它可能被处理为:

    strncpy(c, token, sizeof( c - 1 ) ); 
    

    而不是

    strncpy(c, token, sizeof(c) - 1); 
    

    这可能是你想要的

    (参考文献: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence )