2013-04-05 2 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 я был неправ. он возвращает значение структуры. ничего страшного. –

+0

@ Koushik .. спасибо .. удалил мой комментарий тоже – Ganesh

ответ

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, кажется, неверен в его коде. пролить свет на это. –

+0

Да, теперь, когда он компилируется. Он возвращает значение для длины строки. Остальные обнуляются. –

+0

@RossCournoyer, исправьте условие завершения цикла 'for', как показано в этом ответе. – hmjd

2

Несколько проблем здесь.

  1. В основной() у вас есть char passedString = "Th1s string's g0t it all!"; - символ для хранения одного символа, так что это должно быть 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; 
} 

компилируется и работает отлично на моем конце. Надеюсь это поможет!

Смежные вопросы