0

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

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

它返回句子中的单词数。

这里有更多信息:

您必须保持句子大写,这意味着如果句子大写,则保留大写。如果单词大写,例如名称,则保留大写

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

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

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

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

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 );
4

3 回答 3

0

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

于 2012-10-08T06:56:23.643 回答
0

下面的代码给了我输出:

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 进行大小写转换)。

您可以合理地决定句子末尾的句号(句点)不应包含在数据中(因此 my"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);
}
于 2012-10-08T07:07:37.043 回答
-1

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

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

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

于 2012-10-08T06:57:59.790 回答