2013-04-05 72 views
2

我想实现一个简单的目标,即将字符串传递给函数并返回包含有关该字符串的数据的结构。我写了这个,但是当我尝试编译它时,我得到一个运行时错误,我不明白为什么。我很感谢你看看。传递字符串函数并返回一个结构

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 

struct stringStats 
{ 
    int length; 
    int uppercase; 
    int lowercase; 
    int digits; 
    int nonAlphaNum; 
}; 

struct stringStats stringReader (char anyString[]) 
{ 
    int i; 
    struct stringStats returned = {0, 0, 0, 0, 0 }; 

    returned.length = strlen(anyString); 

    for (i = 0; anyString[i] != '\0'; ++i) 
    { 
     if (isupper(anyString[i])) 
      ++returned.uppercase; 
     if (islower(anyString[i])) 
      ++returned.lowercase; 
     if (isdigit(anyString[i])) 
      ++returned.digits; 
     if (isalnum(anyString[i]) == 0) 
      ++returned.nonAlphaNum; 
    } 
    return returned; 
} 

int main(void) 
{ 
    struct stringStats stored; 
    char passedString[] = "Th1s string's g0t it all!"; 
    stored = stringReader(passedString); 
    printf ("%i\n%i\n%i\n%i\n%i\n", stored.length, stored.uppercase, stored.lowercase, 
            stored.digits, stored.nonAlphaNum); 

return 0; 
} 
+0

@Ganesh我错了。他正在返回结构体的值。没关系。 – 2013-04-05 10:34:55

+0

@Koushik ..谢谢..删除我的评论 – Ganesh 2013-04-05 10:36:17

回答

2

这是不正确的:

char passedString = "Th1s string's g0t it all!"; 

不知道如何编译(建议在最高级别的警告编译和警告视为错误):

 
$ gcc -O2 -Wall -Werror -std=c99 -pedantic main.c -o main -pthread 
main.c: In function ‘main’: 
main.c:38:25: error: initialization makes integer from pointer without a cast [-Werror] 
main.c:39:5: error: passing argument 1 of ‘stringReader’ makes pointer from integer without a cast [-Werror] 
main.c:14:20: note: expected ‘char *’ but argument is of type ‘char’ 
cc1: all warnings being treated as errors 

的类型应该是char[]

char passedString[] = "Th1s string's g0t it all!"; 

请注意,返回类型是合法的,因为局部变量的副本正在返回(按值),而不是局部变量的地址。仅仅为了警告,如果struct包含指针成员,则复制struct是危险的,因为现在两个struct都具有指向相同地址(可能是悬挂指针的潜在来源)的成员。

本地struct确实需要,虽然初始化,因为它不是目前:

struct stringStats returned = {0}; /* All members initialized to zero. */ 

for循环条件是不正确的,会导致永远不会被执行的循环体(第一评价是0 != '\0'这将是错误的)。更改为:

for (i = 0; anyString[i]; ++i) 
{ 
} 
+0

for循环似乎在他的代码中是不正确的。对此有所了解。 – 2013-04-05 10:38:29

+0

是的,现在它编译。它只返回字符串长度的值。其余的都被清零了。 – 2013-04-05 10:49:56

+0

@RossCournoyer,如本答案所示修复'for'循环终止条件。 – hmjd 2013-04-05 10:52:23

2

这里有几个问题。

  1. 在main()你有char passedString = "Th1s string's g0t it all!"; - char是存储单个字符,所以这应该是char *passedString = "Th1s string's g0t it all!";

  2. 你是不是增加他们之前初始化的returned成员。

  3. 您在for循环中的终止条件是检查i本身的值,而您实际上希望检查anyString[i]的值以终止空字符。

0

您正在将本地结构的值返回给调用对象。根据我的经验,仅通过参考并执行内部操作会更安全。

在这看看::

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 

struct stringStats 
{ 
    int length; 
    int uppercase; 
    int lowercase; 
    int digits; 
    int nonAlphaNum; 
}; 

int stringReader (char anyString[], struct stringStats *returned) 
{ 
    int i; 
    returned->digits=0; 
    returned->length=0; 
    returned->lowercase=0; 
    returned->nonAlphaNum=0; 
    returned->uppercase=0; 

    returned->length = strlen(anyString); 

    for (i = 0; anyString[i] != '\0'; ++i) 
    { 
     if (isupper(anyString[i])) 
      ++returned->uppercase; 
     if (islower(anyString[i])) 
      ++returned->lowercase; 
     if (isdigit(anyString[i])) 
      ++returned->digits; 
     if (isalnum(anyString[i]) == 0) 
      ++returned->nonAlphaNum; 
    } 
    return 0; 
} 

int main(void) 
{ 
    struct stringStats stored; 
    char passedString[] = "Th1s string's g0t it all!"; 
    stringReader(passedString,&stored); 
    printf ("%i\n%i\n%i\n%i\n%i\n", stored.length, stored.uppercase, stored.lowercase, 
            stored.digits, stored.nonAlphaNum); 

    return 0; 
} 

这编译和运行完全在我结束。希望这可以帮助!

相关问题