【问题标题】:C pointers to pointers, charactersC 指向指针、字符的指针
【发布时间】:2012-10-08 06:23:48
【问题描述】:

我已经尝试解决这个问题好几个小时了。包括研究,但不行。基本上,我们必须创建函数:

int reverseSentence(char** sentence, char ** newsentance, int maxWords){

它返回句子中的单词数。

这里有更多信息:

您必须保持句子大写,这意味着如果句子是大写的,请保持 首都。如果单词是大写的,比如名字,保留大写

  • 参数句是对一个字符数组的引用,其中的句为 reverse 并且不应由您的函数直接修改。每个单词都是一个数组 在句子中输入。
  • 参数newsentance是对一个字符数组的引用,用来保存新的 句子。
  • 参数maxWords是字符数组的最大大小。
  • 返回句子中的单词数
  • 不要将字符串复制到临时存储并在句子中替换它们。移动 指针。

ex:“成为,还是不成为:这是个问题。”变成“问题是那是:不是或是,到。

现在,我遇到的问题是,目前我的代码有效。但我似乎想不出一种方法来大写某些东西而不会出错。 (因为我们不能做一个新的存储)。

我在这里拥有的基本上是我的代码的一部分:

char ** fptr = sentence; //front sentence
char ** lptr = sentence; //last sentence
char ** nptr = newsentance;//front of new sentance

 if( isupper(**fptr)){ //if the first letter of the first word is capital set flag
   capflag = 1;
}
// find last word before null sentence and also calculate size

while(**(++lptr)) 
   ++size;      

 --lptr;

 if(capflag){ 
    *nptr = *lptr;
    **nptr = toupper(**lptr);            //error here
 }  

另外,我不得不假设句子中的最后一个“单词”是“”,否则我找不到计算句子大小的方法。我希望有人可以帮助我。

我用这个来测试:

  char ** test = malloc(1000);
   *test = "To ";
   *(test+1) = "be ";
   *(test+2) = "or ";
   *(test+3) = "not ";
   *(test+4) = "to ";
   *(test+5) = "be ";
   *(test+6) = "";
   char ** ztest = malloc(1000);
   int rs = reverseSentence(test, ztest, 1000 );

【问题讨论】:

  • 你能指定你想提供给这个函数的确切输入吗?
  • 在我看来这应该可以工作 - 正如 maxim 建议的那样,也许可以在您设置句子缓冲区并调用函数的位置发布代码。
  • 我添加了我用来测试的代码:@MaximSkurydin
  • 你确定反句大写正确吗?当你被告知不要管这些词时,你似乎已经大写了“问题”而没有大写了“到”?说明没有说明您如何在 sentence 参数中检测句子的结尾。空指针标记句子的结尾是一个适度合理的猜测,但这是一个猜测。看来您不必分配内存。它已经分配给你了。
  • 问题是这段代码在运行时失败。如果我删除 if(capflag) 它将是不是或是

标签: c pointers multidimensional-array char


【解决方案1】:

您的代码尝试修改字符串文字,这是未定义的行为(您不能执行“ABC”[1] = 48;某些实现将字符串文字放入只读内存)。 尝试使用 malloc 为每个单独的字符串分配空间,并使用 memcpy 从每个字符串文字中复制数据。

【讨论】:

  • 如何做到这一点?我知道我之前对 char * 有过这个问题,我所做的只是使用 char [] 代替。如何为 2D 做到这一点?
  • 我开始用 char[] 初始化并指向它们。它工作得很好。谢谢!
  • 例如 const char *src = "ABC"; size_t 字符串长度 = strlen( src ) + 1; *( test+4 ) = malloc( string_length ); memcpy( *( test +4 ), "abcd", string_length );或者您可以使用您描述的方法。 char line1[] = "ABC";声明一个包含 4 个字符的数组,用字符串文字的内容对其进行初始化,您可以对其进行修改。
  • @Kalon 这个答案没有回答你的问题,如果你只是用字符串数组而不是文字进行测试以便能够修改字符串,你几乎肯定会让自动化测试仪失败。跨度>
【解决方案2】:

下面的代码给了我输出:

To be or not to be; that is the question.
Number of words: 10
To be or not to be; that is the question.
question. the is that be; to not or be To

它只会随机播放(复制)指针;它不会尝试修改单词的大小写。如果要这样做,它必须更加努力,分配原始句子中前导词的副本(但是你怎么知道那是不是一个名字?)和最后一个词。假设这句话是“伦敦举办了 2012 年奥运会”;反转时,您不想对 London 的 L 进行大小写转换,因为它恰好是句子开头的名称(而且您也不需要对 Olympics 的 O 进行大小写转换)。

您可以合理地决定句子末尾的句号(句点)不应该包含在数据中(所以我的"question."应该替换为"question"),然后添加句子打印代码最后的句号;这是一个微不足道的修改。

#include <stdio.h>

int reverse_sentence(char **fwd_order, char **rev_order, int max_words)
{
     char **end = fwd_order;
     int    num_words = 0;
     for (end = fwd_order; *end != 0 && num_words < max_words; end++)
         num_words++;
     for (int i = 0; i < num_words; i++)
         *rev_order++ = *--end;
     *rev_order = 0;
     return num_words;
}

static void print_sentence(char **words)
{
     const char *pad = "";
     while (*words)
     {
         printf("%s%s", pad, *words++);
         pad = " ";
     }
     putchar('\n');
}

int main(void)
{
     char *sentence[] =
     { "To", "be", "or", "not", "to", "be;", "that", "is", "the", "question.", 0 };
     enum { NUM_WORDS = sizeof(sentence) / sizeof(sentence[0]) };
     char *reversed[NUM_WORDS];
     int num_words;

     print_sentence(sentence);
     num_words = reverse_sentence(sentence, reversed, NUM_WORDS);
     printf("Number of words: %d\n", num_words);
     print_sentence(sentence);
     print_sentence(reversed);
     return(0);
}

【讨论】:

    【解决方案3】:

    ex:“存在还是不存在:这是个问题。”变成“问题是那是:不是或者是,到。

    这是规范的一部分还是您的解释?如果是后者,你应该验证你的解释是否正确,或者你是否只是简单地颠倒单词的顺序,这很容易实现。你甚至知道你是否需要处理标点符号吗?您的代码没有,您的测试与您的示例不匹配。

    软件工程的第一条规则:确定需求。

    【讨论】:

    • 该示例是规范的一部分。我无法做到这一点,但到目前为止我只能实现颠倒顺序。例如:“Hi there 123”变成“123 there Hi”
    • 那么规范包括句尾的句点并要求它留在那里?为什么你的测试看起来不像那个规范?
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多