【问题标题】:How to compare words dictionary size (aba < ada) of a string, using pointers only如何仅使用指针比较字符串的单词字典大小(aba < ada)
【发布时间】:2019-06-07 03:37:08
【问题描述】:

我在第一年,目前正在学习“C”。 这是我第一个真正碰壁的任务,任务是:

"创建一个函数,它接收一个字符串指针和一个字符串大小的指针。字符串本身包含一个句子。该函数将返回一个指向最大字典大小的单词开头的指针(aba

示例:对于句子“aba ada aaa”,函数将返回“ada”,稍后将由 main 打印。

我感觉有点卡住了,我知道我需要遍历整个字符串,至少使用 2 个指针(?)尺寸。但似乎找不到这样做的方法。

在那之前我写了一个超长的代码,但并没有真正起作用,在我看来,我错过了一些重要的东西,而且这段代码不必很长。

int findHighest(char *ptr, int *size)
{
   int nSize = 0, nSize1 = 0;    
   char *ptr3;

   for (char *ptr1 = ptr; *ptr1 != '\0'; ptr1++)
   {
      for (char *ptr2 = ptr1; (*ptr2 != ' ') && (*ptr2 != '\0') ; ptr2++)
      {
          nSize++;
          ptr3 = ptr2;
          nSize1 = nSize;
      }
   }
}
void main()
{
   char sentence[100] = { 0 };
   printf("enter your sentence:\n");
   gets(sentence);
   char sentence2[100];
   int size;
   strcpy(sentence2, findHighest(sentence, &size));
   sentence2[size] = '\0';
   printf("the biggest word is:'%s'\n", sentence2);
   system("pause");
}

【问题讨论】:

  • 让我们从 findHighest 函数实际返回一些东西开始。你承诺你会用声明的char 结果,但从来没有真正这样做过。其次,strcpy 不接受 char 作为任何一个论点,所以这显然也是错误的。
  • ...当然,问题描述说该函数应该返回一个指针,而不是个人char,所以在弄清楚什么 i> 返回的指针。
  • 知道了,但我不知道我将返回什么以及何时返回,我的意思是如果我假设该句子仅包含 3 个单词,我的意思是我可能可以做到,但如果它更长?我似乎无法理解如何在整个句子中继续使用指针,比较其中的所有单词并返回正确的单词。请原谅我的无知,但无法理解有关 strcpy 的评论。
  • 问题是从其他语言翻译过来的吗?措辞“最大的字典大小的单词”在英语中根本不是惯用的,因为它似乎意味着什么。我自己会说更像“按字典顺序排列的最后”,甚至是“按字典顺序排列的最伟大”。
  • 是的。尽我所能翻译它:S

标签: c arrays string function pointers


【解决方案1】:

如果你用整数做一个类似的任务,它会是什么样子?像这样的:

// With ints instead of (sub)strings:
int findHighest(int ints[], int *size) {
    int greatest = ints[0];

    for (int i = 1; i < *size; i++) {
        if (ints[i] > greatest) greatest = ints[i];
    }

    return greatest;
}

对于您的实际问题,这是一个非常好的模型。问题是如何适应这样的东西来处理输入类型和形式的差异,必须避免使用索引的约束,以及返回最大字符串长度的要求。

但在我们继续之前,让我们先处理一个可能会让您感到困惑的问题。如翻译的那样,问题是“函数将返回指向最大单词开头的指针”,而在示例中,您说“函数将返回'ada'”。首先,不,函数本身永远无法返回"ada",因为那是一个数组,你不能在C中返回数组。但更重要的是,当我阅读问题时,你的函数是返回一个指针,指向输入字符串中“ada”子字符串的开头。在您的示例中,如果您使用 puts() 打印它,那么您会看到 ada aaa

那么如何进行呢?让我们从正确的函数签名开始:

char *findHighest(char *string, int *size) {

接下来我们观察,只要输入不包含前导空格,第一个单词的开头与句子的开头相同:

    char *greatest = string;

现在,您需要找到下一个单词的开头,并且当前单词的长度也应该很容易从中得出。给定一个指向下一个单词的指针,您可以通过strcmp() 比较这两个单词,前提是您愿意假设单词之间的空格按字典顺序小于单词中出现的所有字母。对于所有与 ASCII 兼容的单字节编码以及 UTF-8 而言,情况确实如此:小于' ' 的所有字符都是控制字符。但是,如果您想更安全,则可以改用 strncmp(),同时考虑字长。

当您遍历字符串时,您不仅需要跟踪指向迄今为止最伟大单词的指针,还需要跟踪它的长度。最后,你只需

    *size = length_of_greatest;
    return greatest;
}

这是一个学术练习,剩下的细节留给你去解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2021-05-09
    相关资源
    最近更新 更多