我正在为计算机科学课做一些家庭作业,而一项相当繁琐的作业的最后一部分是编写一个可以反转句子的函数。教授提供的函数原型(prototype)是这样的:
int reverseSentence(char** sentence, char **
newsentence, int maxWords)
...其中 sentence 是原始句子,newsentence 是我们应该转储反向句子的地方,而 maxWords 是原始句子中的单词数。我这样写我的函数...
int reverseSentence(char** sentence, char **
newsentance, int maxWords)
{
int i = maxWords;
int x = 0;
while(i > 0){
newsentance[x] = sentence[i];
x++;
i--;
}
return maxWords;
}
然而,循环似乎永远持续下去。另外,我似乎对如何使用 char**
有误解。我以为它只是一个字符串数组,如 char[words][characters]
。但是我收到有关以该形式将一组单词传递给函数的警告。我并不是要任何人为我做功课,只是为了弄清我在如何使用 char**
方面所遗漏的内容。
感谢任何帮助。谢谢。
P.S - 这是我尝试测试我的代码的方式:
char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};
char newsentence[3][4];
reverseSentence(sentence, newsentence, 3);
最佳答案
如评论中所述,代码
char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};
有效但与 char **
不兼容。相反,它应该是:
char *sentence[3] = {"Hi\n", "my\n", "fri\n"};
第一个在内存中是这样布局的,字符打包成一个 block ,三组,每组四个字符:
+---+---+---+---+---+---+---+---+---+---+---+---+
| H | i | \n| \0| m | y | \n| \0| f | r | i | \n|
+---+---+---+---+---+---+---+---+---+---+---+---+
请注意,最后一个条目没有尾随 NUL (\0
),因为数组中可用的 4 个字符没有空间。
第二个声明(你想要的)是一个包含三个指向以 NUL 结尾的字符串的指针的数组:
+---------------+---------------+---------------+
| char * | char * | char * |
+---------------+---------------+---------------+
| | |
| | | +---+---+---+---+---+
| | +--> | f | r | i | \n| \0|
| | +---+---+---+---+---+
| | +---+---+---+---+
| +--> | m | y | \n| \0|
| +---+---+---+---+
| +---+---+---+---+
+--> | H | i | \n| \0|
+---+---+---+---+
关于c - 我对 char** 有什么误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849777/