2014-10-19 60 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 
    } 
相关问题