2013-03-19 46 views
2

我是c編程語言的新手,我有一個與使用字符相關的大學教程作業(我不會爲這個作業評分),在那裏你必須計算單詞,我必須編譯和在線網絡環境提交我的答案在我的代碼將運行對測試用例是不可見的me.here是我的任務:在c編程中使用char

Write the function 'wc' which returns a string containing formatted as follows: "NUMLINES NUMWORDS NUMCHARS NUMBYTES" . Whitespace characters are blanks, tabs (\t) and new lines (\n). A character is anything that is not whitespace. The given string is null-char (\0) terminated.

這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
char* wc(char* data) { 
    char* result ; 
    int numLine ; 
    int numWords ; 
    int numChars ; 
    int i; 
    int numBytes =strlen(data); 
    char* empty=NULL; 
    while(strstr(data,empty)>0){ 
    numWords=1; 

    for (i = 0; i < sizeof(data); i++) { 

    if(data[i]=='\n'){ 
    numLine++; 
    } 
    if(data[i]==' '){ 
    numWords++; 
    } 
    if(data[i]!=' '){ 
    numChars++; 
    } 
    } 

    } 

    sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes); 
    return result; 
} 

這代碼會給我正確的輸出結果,但我在這裏錯過了一些東西至少測試告訴我這一點。

+0

如果你確實得到正確的結果,那麼你是什麼意思「我錯過了什麼」? – 2013-03-19 17:48:45

+0

他不知道正在使用的確切測試用例。 – 2013-03-19 17:50:01

回答

5

你已經有了一個非常嚴重的錯誤:

char* result; 
    ... 
    sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes); 

這不是在C.讓您需要的字符串首先分配足夠的存儲空間。將result聲明爲足夠大的靜態數組,如果您在課程中已經介紹過,則使用malloc

例如

char buf[100]; // temporary buffer 

sprintf(buf, "%d %d %d %d", numLine, numWords, numChars, numBytes); 

char *result = malloc(strlen(buf) + 1); // just enough for the string 
strcpy(result, buf);      // store the string 

return result; 
+0

將其更改爲:char * result = malloc(sizeof(data)* strlen(data)); – Solix 2013-03-19 17:59:28

+0

@Solix'sizeof(char)'總是定義爲1。如果不是,則應該使用sizeof(* data)'或sizeof(data [0])來獲取指針指向的數據大小。 – 2013-03-19 18:01:33

+0

@Solix - 你需要'strlen(data)+ 1',一個額外的終止'\ 0'。但在這種情況下,您要複製的字符串與「data」不同。最好使用臨時緩衝區'sprintf',然後使用'strlen'來分配'result',然後複製。 – teppic 2013-03-19 18:03:16

1

1)的sizeof是錯誤的:

而不是sizeof操作時,您需要使用strlen() for循環,如:

for (i = 0; i < strlen(data); i++) 
       ^not sizeof 

sizeof(data)只返回的數據指針地址的大小是4。因爲你要閱讀所有字符在data[]需要strlen()將返回的data[]長度(或數字字符的data[]

2)內存錯誤:

下一個錯誤,我可以看到沒有記憶分配給result。它聲明像:

char* result ; 

並沒有內存分配!並且您使用sprintf導致你的代碼

3)一段時間(的strstr(數據,空)> 0)是到其他字符串錯誤

strstr()搜索位置的未定義行爲寫你空字符串是NULL,請檢查: char *strstr(const char *s1, const char *s2);

你的strstr()總是返回data,你爲什麼要叫這個?我相信你不需要這個while()循環。

我提高你的代碼高達有的下方延伸,有隻有三個錯誤,因爲我上面提到現予以更正(理解閱讀評論),您的基本算法中正確的是:

#define SIZE 256 // added size macro 
char* wc(char* data) 
    char* result = malloc(SIZE*sizeof(char)); //(2) allocated memory for result 
    int numLine ; 
    int numWords ; 
    int numChars ; 
    int i; 
    int numBytes =strlen(data); 
    numWords=1; 
        // (3) remove while loop 
    for (i = 0; i < strlen(data); i++) { //(1) change size 
     if(data[i]=='\n'){ 
     numLine++; 
    } 
     if(data[i]==' '){ 
     numWords++; 
    } 
     if(data[i]!=' '){ 
     numChars++; 
    } 
    } 
    sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes); 
    return result; 
} 

int main(){ 
    printf("\nresult: %s\n", wc("q toei lxlckmc \t \n ldklkjjls \n i \t nn ")); 
    return 1; 
} 

輸出:

result: 2 14 28 41 
+0

thx man,我將其更改爲strlen(數據),但仍然失敗。 – Solix 2013-03-19 17:53:47

+0

@Solix還有其他錯誤也喜歡閱讀我更新的答案 – 2013-03-19 17:56:23

+0

中的第二點你是正確的錯誤,我已經糾正它,但仍然沒有機會通過一個單一的測試用例。 – Solix 2013-03-19 23:01:26

2

如果您有此輸入,該怎麼辦?

Two  Words. 

您必須計算空格/非空格之間的轉換,而不僅僅是計數空格。


此外,我很確定strstr(data,NULL)不會做任何有用的事情。

+0

luser你的意思是我還要檢查'\ t'嗎? – Solix 2013-03-19 17:55:46

+0

這就是@kelberry所說的。並且我同意。但我在談論單詞之間的多個空格。 – 2013-03-19 17:59:10

1

也似乎缺少\t的標籤在你的空白檢查,並且當您或退出一個字是不是在正確的檢查。您可以使用布爾類型bool爲此定義在stdbool.h爲此。 WC UNIX命令的