我在填充动态创建的字符串数组时遇到问题。该数组基本上包含两个字符串,我想用它们的长度打印它们。我得到一个非常奇怪的结果,因为内存位置混乱。请参阅下面的代码。
我们非常感谢任何建议。感谢。
void printWords(char **words, int numberOfWords)
{
int index;
for (index = 0; index < numberOfWords; index++)
{
printf("%s, %d\n", &(*words)[index], (int)strlen(&(*words)[index]));
}
}
void fillWords(char **words)
{
*words = malloc(2 * sizeof(char *));
char hello[] = {"Hello"};
(*words)[0] = (char)malloc(strlen(hello) * sizeof(char));
strcpy(&(*words)[0], hello); //Copy word into array
char world[] = {"Worldz"};
(*words)[1] = (char)malloc(strlen(world) * sizeof(char));
strcpy(&(*words)[1], world); //Copy word into array
}
int main (int argc, const char * argv[])
{
char *words;
fillWords(&words);
printWords(&words, 2);
return 0;
}
预期输出应为
Hello, 5
Worldz, 6
然而我正在
HWorldz, 7
Worldz, 6
答案 0 :(得分:1)
第一个问题:你不能在char *
中放两个单词(嗯......你可以,但不是你正在做的方式;而且这样做的方式与你的不一样)代码)
你需要一个“字符串数组”,或者更像C的数组char *
:
char *words[2]; /* words[0] and words[1] are pointers to char */
char *wrong; /* wrong[0] is a char; wrong[1] is a char */
因此,更改主文件中words
的定义,并检查/编辑所有其他功能是否正确。
int main (int argc, const char * argv[])
{
char *words[2];
fillWords(words);
printWords(words, 2);
return 0;
}
答案 1 :(得分:1)
我认为您在char *
和char **
之间感到困惑。
此外,请确保为字符串末尾的空终止字符分配足够的内存。
这是我的解决方案:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
void printWords(char **words, int numberOfWords)
{
int index;
for (index = 0; index < numberOfWords; index++)
{
printf("%s, %d\n", words[index], (int)strlen(words[index]));
}
}
char ** createWords()
{
char ** words;
// Allocate memory for an array of pointers, length 2.
words = malloc(2 * sizeof(char *));
char hello[] = {"Hello"};
words[0] = malloc((strlen(hello)+1) * sizeof(char));
strcpy(words[0], hello); //Copy word into array
char world[] = {"Worldz"};
words[1] = malloc((strlen(world)+1) * sizeof(char));
strcpy(words[1], world); //Copy word into array
return words;
}
int main (int argc, const char * argv[])
{
char **words;
words = createWords();
printWords(words, 2);
return 0;
}
我将fillWords重命名为createWords并使其返回指针而不是将指针作为参数。如果你真的希望fillWords将指针作为参数,你可以这样做,但参数必须是char ***
类型。
答案 2 :(得分:0)
这是解决方案。我在char *和char之间感到困惑。我想要的是一系列字符。
void printWords(char **words, int numberOfWords)
{
int index;
for (index = 0; index < numberOfWords; index++)
{
printf("%s, %d\n", words[index], (int)strlen(words[index]));
}
}
void fillWords(char **words)
{
*words = malloc(2 * sizeof(char *));
char hello[] = {"Hello"};
words[0] = malloc(strlen(hello) * sizeof(char));
strcpy(words[0], hello); //Copy word into array
char world[] = {"Worldz"};
words[1] = malloc(strlen(world) * sizeof(char));
strcpy(words[1], world); //Copy word into array
}
int main (int argc, const char * argv[])
{
char *words;
fillWords(&words);
printWords(&words, 2);
return 0;
}