我正在尝试将带有新字符串的字符串数组传递给函数,在此函数中,我想将此字符串添加到数组中并重置字符串。我似乎无法让它在函数内工作,但没有一个它可以工作
int main(void)
{
const char* text = "hello world";
int text_length = strlen(text);
char* words[text_length];
char word[text_length];
int length = 0;
int k = 0;
for (int i = 0; i < text_length; ++i) {
if (isspace(text[i])) {
words[length] = malloc(strlen(word) + 1);
strcpy(words[length++], word);
memset(word, 0, sizeof(word));
k = 0;
}
//...
//... adding chars to the word
word[k++]= text[i];
}
}
这工作得很好,这不会:
void add_word(char* words[], char* word, int* words_length, int* word_cursor)
{
words[*words_length] = malloc(strlen(word) + 1);
strcpy(words[*words_length++], word);
memset(word, 0, sizeof(word));
*word_cursor = 0;
}
int main(void)
{
const char* text = "hello world";
int text_length = strlen(text);
char* words[text_length];
char word[text_length];
int length = 0;
int k = 0;
for (int i = 0; i < text_length; ++i) {
if (isspace(text[i])) {
add_word(words, word, &length, &k);
}
//...
//... adding chars to the word
word[k++]= text[i];
}
}
我错过了什么?
我的猜测是它不起作用,因为您没有在word
数组中正确添加 null 终止符。
在第二个示例中,您刚刚复制粘贴了第一个工作代码中的代码,并且忘记更改一个关键位:
memset(word, 0, sizeof(word));
在函数add_word
中,变量word
是一个指针,sizeof(word)
返回指针本身的大小,而不是它指向的内容。
确保word
中的字符串始终以 null 结尾的最佳解决方案是在要将其视为字符串时在所需的位置实际显式添加终止符:
if (isspace(text[i])) {
word[k] = ' '; // Add null-terminator
add_word(words, word, &length, &k);
}
你有未定义的行为
void add_word(char* words[], char* word, int* words_length, int* word_cursor) {
strcpy(words[*words_length++], word);
因为,word
不包含容纳null
字符的空间。
const char* text = "hello world";
int text_length = strlen(text);
char word[text_length];
应该是
char word[text_length+1];
和
…
if (isspace(text[i])) {
word[k]= ' '; //Null terminate the string
add_word(words, word, &length, &k);
}