2012-10-08 213 views
0

我一直在试图解决这个问题数小时。包括研究,但没有去。基本上,我们必须以创建功能:C指针,指针,字符

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

当它返回一个句子中的单词数。

下面是详细信息:

你必须保持句子的资本,这意味着如果句子是资本,保持 资本。如果一个字是大写,如名称,保留资本

  • 参数句话是一个字符数组与句子的引用, 相反,不应该由你的函数直接进行修改。句子中的每个单词都是数组 条目。
  • 参数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); 
+0

你能指定你想喂给这个函数的确切输入吗? –

+0

对我来说,这似乎应该起作用 - 正如格言所示,可能会在设置语句缓冲区并调用函数的地方发布代码。 – Elemental

+0

我添加了以前用于测试的代码:@MaximSkurydin – Kalon

回答

0

您的代码试图修改字符串常量,这是不确定的行为(你不能做“ABC” [1] = 48;一些实现把字符串常量为只读记忆)。 尝试为每个单独的字符串使用malloc分配空间,并使用memcpy从每个字符串文本复制数据。

+0

这怎么办?我知道我以前有过这个问题,因为char *的全部我都是用char []来代替的。如何为2D做到这一点? – Kalon

+0

我开始用char []进行初始化并指向它们。它效果很好。谢谢!例如, – Kalon

+0

,const char * src =“ABC”; size_t string_length = strlen(src)+ 1; *(test + 4)= malloc(string_length); memcpy(*(test +4),“abcd”,string_length);或者你可以使用你描述的方法。 char line1 [] =“ABC”;声明一个包含4个字符的数组用字符串文本的内容初始化它,并且可以修改它。 –

-1

例如:“是或不是:就是问题”。

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

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

+0

该示例是规范的一部分。我无法做到这一点,但迄今为止,我只能实现倒车顺序。例如:“你好123”成为“123你好” – Kalon

+0

因此,规范包括在句子结尾的时期,并要求它留在那里?为什么你的测试看起来不像那个规范? –

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年奥运会”;当相反的时候,你不想对伦敦的L进行个案换算,因为它是一个恰好开始句子的名字(而且你也不需要对奥运会的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); 
}