C函数之间传递字符串

问题描述:

我正在用C编写简单的程序,并得到了stucked。我有三个功能:C函数之间传递字符串

void changeStatusOfBook(User users[], Book books[]) { 
    char *id= askForBookID(); 
    Book book = getBookById(books, id); 
    . 
    . 
    . 
} 

char * askForBookID() { 
    char id[6]; 
    printf("Tell me which book (ID)\n"); 
    scanf_s("%5s",id, 6); 
    return id; 
} 

Book getBookById(Book books[], char bookID[]) { 
    int counter = 0; 
    //bookID becomes a trash here 
    . 
    . 
    . 
} 

的问题是:在第一个功能,我得到正确的用户输入的字符串,但是当我将它传递给第三个功能我得到它的一些垃圾。如何解决它?

+0

编译所有警告和调试信息。请注意,当作为参数传递时,数组会衰减为指针。 –

您不能从函数返回本地变量char id[]。它的内存位于堆栈上,并且函数返回该函数的所有堆栈内存并且其局部变量不再可访问。

当堆栈上的内存需要另一个程序时,它会覆盖char id的内存空间,这对您的程序来说会成为问题。

char * askForBookID() { 
     //char id[6]; 
     char *id = malloc(sizeof(char)*6); 
     if(!id){ //check if malloc got some memory for id 
      printf("Sorry not enough memory"); return NULL; 

     } 

     printf("Tell me which book (ID)\n"); 
     scanf_s("%5s",id, 6); 

     return id; 
} 
+0

我更喜欢我的答案,因为它不会对平台上的c的实现做任何假设,但这个答案可能更有用。有一个upvote。 – Bathsheba

+0

@Bathsheba我同意你的意见。 –

+0

感谢它的工作 - 我试图在changeStatusOfBook()中使用malloc,但不知道为什么我没有考虑askForBookID()。 – MrKaszu

函数askForBookID返回具有自动存储持续时间的数组的第一个元素的地址。

您使用该指针oncce函数的行为被称为未定义。

改用malloc代替。