我对char **的误解是什么?

时间:2012-10-11 22:50:37

标签: c pointers char

我正在为计算机科学课做一些家庭作业,而一个相当繁琐的任务的最后一部分是编写一个可以反转句子的功能。教授提供的函数原型如下所示:

int reverseSentence(char** sentence, char **
                newsentence, int maxWords)

...句子是原始句子,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);

3 个答案:

答案 0 :(得分:4)

如评论中所示,代码

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

有效但与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|
            +---+---+---+---+

答案 1 :(得分:3)

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

  1. 你从i = maxWords开始......这似乎不对。数组的索引是0,所以如果设置i = maxWords
  2. 会发生什么
  3. 命名有点奇怪。首先,您在newsentance中输入错字。其次你称之为maxWords,但它应该更像numWords,对吧?
  4. 如果你对char*的理解是它是一个“字符串数组,比如char [words] [characters]”那么你对C类型的思考方式与它实际存在方式之间存在巨大差距(简短的总结是类型/内存是C)中最重要,最基本和令人困惑的部分之一。您是否有一本教科书可以阅读有关如何在C中表示类型的内容?我不确定你是否需要知道这项任务......天真地工作可能是有目的的。
  5. 编辑哦亲爱的。您对原始句子的声明是否编译?我不确定怎么样。你可能想再次阅读指针......

答案 2 :(得分:0)

您可以将char **句子视为字符串的向量。你可以使用字符串函数,例如strlen,例如:strlen(sentence [0])会给你第一行的长度。然后你可以从最后到开始,从lenght - 1开始朝向0.不要忘记计算方式中的空格,这样你就可以正确地减少单词计数器。请记住,也许你找到不止一个空格分隔两个单词,你应该在减少计数器时考虑到这一点。不要忘记将'\ 0'放在新字符串的末尾。

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