2012-10-08 264 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); 
}