2016-05-09 38 views
0

我有以下代码:strlen的不指针返回正确的值到一个数组

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 
realtor_command[0]="test_string" 
realtor_command[1]="next_test_string" 

当我使用strlen(realtor_command[0])我得到错误的值,我在以前的问题,阅读出现这种情况,因为它的一个数组,并不是指针,但我还没有找到任何修复这个问题。

我的问题是如果有反正得到的长度realtor_command[i]

非常感谢。

编辑:

这是我如何调用strlen的:

char* matrix=malloc(strlen(realtor_command[8])+1); 
+2

告诉你如何使用'strlen',请一起错误的价值。 – Downvoter

+8

什么是'sizeof(120)'?你分配的内存少于120字节。 – ForceBru

+2

这将是sizeof(int),4或8. –

回答

3

在此代码:

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 

来控制循环REALTOR_MAX_COMMAND字符串创建的120个字符串,一个数组(大概是这应该是120?)并将它们设置为新分配的4或8字节字符串(sizeof(120)表示sizeof(int),它是4或8字节)。由于这些字符串是新分配的,它们将包含任意数据,并且可能不以null结束符结束。

这很重要,因为strlen()只是在字符串上循环,直到找到空终止符为止,所以它不能用非空终止的字符串。

你可以自己添加一个null终止符,但是这些字符串会包含任意垃圾直到字符串的末尾,并且它们可能在它们内部具有空终止符。你可以让他们空终止启动,但随后strlen()总是返回0。

什么可能是更好的是分配这些字符串当你真正填补他们,并让他们为空指针,直到然后:

char* realtor_command[120]; 
for (int i = 0; i < 120; i++) { 
    realtor_command[i] = NULL; 
} 

char input_buffer[REALTOR_MAX_COMMAND]; 

// Read in one string, then copy it so we can re-use the buffer 
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin); 
realtor_command[0] = strdup(input_buffer); 

这也将避免代码中的内存泄漏。

注意,你可能会想,以确保通过fgets阅读字符串中包含换行,以确保输入符合贵公司的缓冲:

if (strstr(input_buffer, "\n") == NULL) { 
    // error, input didn't fit in our buffer! 
}