2013-03-19 64 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命令的