2013-03-05 105 views
0

我有问题的值分配给一个二维数组的字符串。以下是代码:二维数组的字符串和Strcpy错误?

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 =进制

CHUNK 2 =有

这是正确的,但是当我打印清单,我得到

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

任何想法林做错了什么?

回答

2

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

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

+0

好的,所以如果我正确理解这一点,我必须在每次清点结束后追加一个终止字符到strncpy后? – p0ny 2013-03-05 22:23:58

+0

是的。你需要有足够的空间,所以声明'char inventory [totalRuns] [chunkSize + 1];'。那么,如果你初始化整个库存,你不需要添加0-终结符,因为它们已经在那里了。 – 2013-03-05 22:28:11

+0

现在就开始工作吧!谢谢你的帮助! – p0ny 2013-03-05 22:36:22