我想在getInfo函数中获取某人的信息。
如果我在getInfo函数的IN中打印名称,它会正确打印出来,但在那之后,它会在主体中留下一些随机字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getLine(){
char *line = malloc(256);
fgets(line, 256, stdin);
if ((strlen(line) > 0) && (line[strlen (line) - 1] == 'n'))
line[strlen (line) - 1] = ' ';
return line;
}
void getInfo(char* name,char* place,char* days[]){
printf("Type in your name:n");
name = getLine();
printf("%s",name); // <---- THIS PRINTS OUT CORRECTLY
}
int main( int argc, const char* argv[] )
{
char* name = (char*)malloc(100*sizeof(char));
char* place = (char*)malloc(100*sizeof(char));
char* days[5];
getInfo(name,place,days);
printf("%sn",name); // <----- THIS LEAVES SOME CHARACTERS
}
输出:
C:UsersFelhasznaloDesktop>a.exe
Type in your name:
Peter Smith
Peter Smith`┴
这些"`\┴"字符就是我所说的。函数中的第一个打印效果很好,但总的来说,它给出了这些幽灵字符。
为什么要写出来?谢谢
问题是您正在替换main
函数传递给getInfo()
的'name'指针。这是因为getInfo()
调用getLine()
,CCD_4本身会创建一个新的字符数组,并将指向该缓冲区的指针返回给getInfo()
。
在getInfo()
中,这是正确打印的(正如您所注意到的(;然而,main
函数传递name
指针的副本(即按值(,而getInfo
函数不能(不能(更改这一点。因此,在main
中,您将打印出一个未初始化的字符数组(name
(。
有几种方法可以解决这个问题。一种方法是将name
(可能还有place
(参数作为指向指针的指针传递给getInfo()
,此时您需要在该函数中取消引用该参数;像这样:
void getInfo(char** name, char** place, char* days[])
{
printf("Type in your name:n");
*name = getLine();
printf("%s", *name);
}
然后,在main
中,您:(a(不需要为name
(和place
(分配内存,因为这是由getLine()
函数完成的;(b( 将CCD_ 19指针的地址传递给CCD_ 20。像这样,例如:
int main(int argc, const char* argv[])
{
char* name;// = (char*)malloc(100 * sizeof(char));
char* place;// = (char*)malloc(100 * sizeof(char));
char* days[5]; // Don't know what you want to do with this!
getInfo(&name, &place, days);
printf("%sn", name);
// Don't forget to free the allocated buffers:
free(name);
// free(place);
return 0;
}
请随时要求进一步澄清和/或解释。
getInfo()
中的name = getLine();
不影响main()
中的CCD23。
尝试从getinfo()
返回name
,并在main()
中分配char *name = getline(...)
。
旁白:getline()
的替代代码
char* getLine(){
char buffer[256];
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
return NULL;
}
size_t len = strlen(buffer);
if (len > 0 && buffer[len - 1] == 'n') {
buffer[--len] = ' ';
}
char *line = malloc(len + 1);
if (line) {
memcpy(line, buffer, len + 1);
}
return line;
}