2016-05-09 80 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! 
}