【问题标题】:2d array of strings and Strcpy fault?二维字符串数组和Strcpy故障?
【发布时间】:2013-03-05 22:07:16
【问题描述】:

我在为二维字符串数组赋值时遇到问题。代码如下:

  Char array[]= "Nary had a little lamb";
  int chunkSize = 4;
  char inventory[totalRuns][chunkSize];

  subString(result, array,0,0+chunkSize);
  printf("CHUNK 1 = %s\n",result);          //Prints "Nary"
  strncpy(inventory[0],result,chunkSize);
  memset(result, '\0', strlen(result));

  subString(result, array,pos,pos+chunkSize);
  printf("CHUNK 2 = %s\n",result);          // Prints " had"
  strncpy(inventory[1],result,chunkSize);

以及函数子串:

char *subString(char* putHere, char* request,int start,int end){
    char* loc = request+start;
    char* end_loc = request+end;

    memcpy(putHere, loc, end_loc-loc);

    return putHere; 

}

当我运行这段代码时,输​​出是

CHUNK 1 = Nary

CHUNK 2 = 有

这是正确的,但是当我打印库存时,我得到了

inventory[0]=Nary had       //Should be just "Nary"
inventory[1]= had           //correct

任何想法我在这里做错了什么?

【问题讨论】:

    标签: c arrays strcpy


    【解决方案1】:

    subString 不会 0 终止目标缓冲区,如果给定范围内没有 0 字节,strncpy 也不会 0 终止。因此,您的 inventory 包含未终止的 char 序列,并且打印打印直到 printf 在某处找到 0 字节或由于访问冲突而崩溃。

    inventory 的内存布局在inventory[0] 的最后一个char 之后直接有inventory[1],所以printf("%s", inventory[0]); 打印两个块,因为第一个不是0 终止的。在您的情况下,之后似乎有一个 0 字节,但由于 inventory 没有初始化,这是巧合。

    【讨论】:

    • 好的,如果我理解正确的话,我必须在每个库存的末尾附加一个终止字符,然后我才对它进行 strncpy 操作?
    • 是的。你需要为它留出空间,所以声明char inventory[totalRuns][chunkSize + 1];。好吧,如果您对整个 inventory 进行 0 初始化,则无需添加 0 终止符,因为它们已经存在。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2016-05-06
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多