为什么printf会在主函数中留下一些随机字符?[C程序]



我想在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;
}

最新更新