3

我正在为计算机科学课做一些作业,而一项相当乏味的作业的最后一部分是编写一个可以反转句子的函数。教授提供的函数原型是这样的:

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**.

任何帮助表示赞赏。谢谢你。

PS - 这就是我尝试测试我的代码的方式:

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};
char newsentence[3][4];
reverseSentence(sentence, newsentence, 3);
4

3 回答 3

4

如您的评论所示,代码

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};

有效,但与 a 不兼容char **。相反,它应该是:

char *sentence[3] = {"Hi\n", "my\n", "fri\n"};

第一个在内存中是这样排列的,字符打包成一个块,三组,每组四个字符:

+---+---+---+---+---+---+---+---+---+---+---+---+
| 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|
            +---+---+---+---+
于 2012-10-11T22:58:54.827 回答
3

我不确定为什么它会永远循环......但有几点需要注意:

  1. 你从i = maxWords...开始,这似乎是错误的。数组从 0 开始索引,那么如果你设置 会发生什么i = maxWords
  2. 取名有点奇怪。首先你有一个错字newsentance。第二个你叫它,maxWords但它应该更像numWords,对吧?
  3. 如果您的理解char*是它是一个“字符串数组,例如 char[words][characters]”,那么您对 ​​C 类型的看法与其实际存在的方式之间存在巨大的差距(简短的总结是类型/内存是 C) 中最重要、最基础和最令人困惑的部分之一。你有一本教科书来了解 C 中的类型是如何表示的吗?我不确定您是否甚至需要为这项任务知道它......可能是天真的工作。

编辑哦,亲爱的。您对原句的声明甚至可以编译吗?我不太确定怎么做。您可能想再次阅读有关指针的内容...

于 2012-10-11T22:58:08.587 回答
0

您可以将 char** 句子视为字符串的向量。您可以使用字符串函数,例如 strlen,例如:strlen(sentence[0]) 会给您第一行的长度。然后,您可以从结尾到开头,从 lenght - 1 到 0 开始。不要忘记计算空格,以便正确减少单词计数器。请记住,您可能会发现不止一个空格分隔两个单词,并且在递减计数器时应该考虑到这一点。不要忘记将 '\0' 放在新字符串的末尾。

要复制到新的“字符串向量”,您应该小心 malloc 和 realloc,或者......您可以搜索最长的行并分配具有该大小的所有行。请记住,当你打印一个字符串时,它会在你得到 '\0' 字符时停止,不管向量的大小。

于 2012-10-12T02:37:02.030 回答