2013-09-05 53 views
-4

如何在一個函數中返回一個字符串或數字。如何動態地用一個函數返回數字或字符串?

如:

int main() 
{ 
    printf("%s",rawinput("What is your name: ", "s")); 
    printf("%d", rawinput("How old are you: ", "n")); 
} 

([int] or [char *]) rawinput(char *message, char *type) 
{ 

if(!strcmp(type,"n")){ 
    int value; 
    scanf("%d",&value); 
    return value;} 
else if(!strcmp(type, "s")){ 
    char *value[1024]; 
    fgets(value,1024,stdin); 
    return value;} 
} 

注意定義rawinput功能變化的方式爲主。

+2

問題是...? – P0W

+0

如何使用相同的函數返回一個數字或字符串。是否需要使用數組來完成? –

+0

你必須返回一個聯合或結構。這是錯誤的char *值[1024];使用'char值[1024];'。你不需要1024個字符串指針。 – dcaswell

回答

0

不要這樣做。有一種方法,但這是一種不好的做法,你不應該使用它。這裏是一個更好的選擇:

typedef union RAWINPUT_UNION 
{ 
    char *string; 
    int integer; 
}RAWINPUT; 

RAWINPUT rawinput(char *message, char *type) 
{ 
    char *resultstring 
    int resultinteger; 
    RAWINPUT ri; 

    // Blah blah blah some code here. 

    if(type[0] == 's') 
     ri.string = resultstring; 
    else if(type[0] == 'i') 
     ri.integer = resultinteger; 

    return ri; 
} 

而壞的方法是:你可以在它的指針執​​行整數運算和存儲的變量,因爲指針是事實上的整數,只是抽象的addictional層在編譯器中。

0

鑑於返回值需要在一個printf("%s",...一個char *int INT printf("%d", ...,函數應該匹配格式指示符和呼叫之間是不同的返回類型以避免不確定的行爲(UB)。讓我們使用:

typedef struct { 
    union { 
    char *s; 
    int i; 
    } u; 
    char type; 
} raw_t; 

raw_t rawinput(const char *message, char type) { 
    raw_t r; 
    printf("%s", message); 
    r.type = type; 
    switch (type) { 
    case 'n': 
    if (1 != scanf("%d", &r.u.i)) { 
     ; // handle error; 
    } 
    break; 
    case 's': { 
    char tmp[1024]; 
    if (1 != scanf("%1023s", tmp)) { 
     ; // handle error; 
    } 
    r.u.s = strdup(tmp); 
    break; 
    } 
    default: 
    ; // handle error; 
    } 
    return r; 
} 

int main() { 
    printf("%s\n", rawinput("What is your name: ", 's').u.s); // Note .u.s 
    printf("%d\n", rawinput("How old are you: " , 'n').u.i); // Note .u.i 
    return 0; 
} 

小心內存泄漏的printf("%s...

相關問題