2013-04-05 91 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; 
} 

這編譯和運行完全在我結束。希望這可以幫助!

相關問題