在函数内更新字符串数组
updating string array inside a function
我正在尝试将一个带有新字符串的字符串数组传递给一个函数,在这个函数中我想将这个字符串添加到数组中并重置该字符串。我似乎无法让它在函数内部工作,但没有它就可以工作
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];
}
}
我错过了什么?
你有未定义的行为
void add_word(char* words[], char* word, int* words_length, int* word_cursor) {
strcpy(words[*words_length++], word);
因为,word
不包含 space 来保存 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]= '[=13=]'; //Null terminate the string
add_word(words, word, &length, &k);
}
我的猜测是它不起作用,因为你没有在[=12中正确添加空终止符=]数组。
在第二个示例中,您只是复制粘贴了第一个工作代码中的代码,而忘记更改一个关键位:
memset(word, 0, sizeof(word));
在函数add_word
中变量word
是一个指针,sizeof(word)
returns指针的大小本身而不是它指向的东西。
确保 word
中的字符串始终以 null 结尾的最佳解决方案是,当您想将其视为字符串时,在需要的地方实际明确地添加终止符:
if (isspace(text[i])) {
word[k] = '[=11=]'; // Add null-terminator
add_word(words, word, &length, &k);
}
我正在尝试将一个带有新字符串的字符串数组传递给一个函数,在这个函数中我想将这个字符串添加到数组中并重置该字符串。我似乎无法让它在函数内部工作,但没有它就可以工作
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];
}
}
我错过了什么?
你有未定义的行为
void add_word(char* words[], char* word, int* words_length, int* word_cursor) {
strcpy(words[*words_length++], word);
因为,word
不包含 space 来保存 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]= '[=13=]'; //Null terminate the string
add_word(words, word, &length, &k);
}
我的猜测是它不起作用,因为你没有在[=12中正确添加空终止符=]数组。
在第二个示例中,您只是复制粘贴了第一个工作代码中的代码,而忘记更改一个关键位:
memset(word, 0, sizeof(word));
在函数add_word
中变量word
是一个指针,sizeof(word)
returns指针的大小本身而不是它指向的东西。
确保 word
中的字符串始终以 null 结尾的最佳解决方案是,当您想将其视为字符串时,在需要的地方实际明确地添加终止符:
if (isspace(text[i])) {
word[k] = '[=11=]'; // Add null-terminator
add_word(words, word, &length, &k);
}