2014-10-19 539 views
-4

爲什麼會出現錯誤的輸出從一個函數返回一個字符串

OUTPUT: 輸入烏爾名字: saurav 你的名字是SA-(

#include <stdio.h> 
#include <conio.h> 

char * func(); 
int main() 
{ 
    printf("Your name is %s\n",func()); 
    return 0; 
} 

char* func() 
{ 
    char L[10]; 
    printf("Enter ur name:\n"); 
    gets(L); 
    return L; 
} 
+4

您正在調用未定義的行爲,方法是返回一個自動變量'L'的地址,該變量在調用者使用該地址之前就已經過去了。有幾十*這個問題的重複,[**這是其中之一**](http://stackoverflow.com/questions/16738954/returning-an-array-from-a-c-function)。並停止使用['gets()'](http://en.cppreference.com/w/c/io/gets)。 – WhozCraig 2014-10-19 18:36:32

+1

您正在返回在'func'範圍內創建的變量的地址 – adam10603 2014-10-19 18:42:00

+1

迂迴點:返回值'L'不是問題。這是'printf'取消引用該值以打印它期望在該地址處的字符串內容。如果代碼是'printf(「你的名字是%p \ n」,func());' - >沒有問題,只是會出現一個數字而不是名字。 – chux 2014-10-19 18:54:35

回答

2

您不能返回指向局部變量。那麼,你可以但它不會按預期工作。

你的函數應該得到指針作爲參數,並寫在那裏:

void func(char *L) 
{ 
    printf("Enter your name:\n"); 
    gets(L); 
} 

int main() 
{ 
    char L[10]; 
    func(L); 
    printf("Your name is %s\n", L); 
} 

請注意,gets()就是這樣精確定義的。

現在,這段代碼是災難的祕訣。實際上gets()不應該被使用,因爲它不會,也不能檢查緩衝區溢出。這樣做,而不是:

void func(char *buf, size_t len) 
{ 
    printf("Enter your name:\n"); 
    fgets(buf, len, stdin); 
} 
int main() 
{ 
    char L[10]; 
    func(L, sizeof(L)); 
    printf("Your name is %s\n", L); 
} 
+0

@ Smac89:是的!我只是將其添加到答案中。問題不在於此,而是要記住永遠是件好事。實際上,這是從該語言的最新版本中刪除的少數C語言之一,因爲沒有單一的充分理由使用它。 – rodrigo 2014-10-19 18:43:54

+0

@chux:確實。糾正。 – rodrigo 2014-10-19 18:50:43

0

使用字符串,而不是字符*:

#include <stdio.h> 
#include <conio.h> 
#include <iostream> 
#include <string> 
using namespace std; 

string func(); 
int main() 
{ 
    cout << "Your name is\n" << func(); 
    system("pause"); 
    return 0; 
} 

string func() 
{ 
    string L; 
    printf("Enter ur name:\n"); 
    cin >> L; 
    return L; 
} 
+2

它未被標記爲C++。 – user1336087 2014-10-19 18:53:06

+1

'使用命名空間標準;'在C中不編譯 – chux 2014-10-19 18:57:33

0

使用:

static char L[10]; 

保持它周圍,FUNC不會重入

1

你會在你的代碼中改變你的輸出。

#include <stdio.h> 
    #include <conio.h> 

    char *func(); 
    int main() 
    { 
     printf("Your name is %s\n",func()); 
     return 0; 
    } 

    char *func() 
    { 
     char L[10]; 
     printf("Enter ur name:\n"); 
     gets(L); 
     printf("%s", L);   //changed line 
    } 
相關問題