在此代碼:
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!
}
告訴你如何使用'strlen',請一起錯誤的價值。 – Downvoter
什麼是'sizeof(120)'?你分配的內存少於120字節。 – ForceBru
這將是sizeof(int),4或8. –