c语言 - 我有一个将字符串作为参数的函数.v手动输入字符串有效,但使用 scanf 不起作用



我有这样一个函数f(char * str)。string参数是使用另一个函数访问的文件名。所以如果我做f("grille1.txt"),程序就像预期的那样工作。但是,如果我这样做

char * filename;
scanf("%s", filename);
f(filename);

程序没有按预期工作。所以我得出结论,问题出在scanf上。然而,我试着做

printf("%d Are they equal?", !strcmp(filename, "grille1.txt"));

和我得到一个1作为结果,这意味着它们确实是相等的,那么问题是什么导致使用变量filename不给出与手动使用"grille1.txt"相同的结果?

函数scanf需要一个足够大的内存位置的地址,它应该写字符串,你应该把这个内存位置的地址作为参数传递给scanf。但是,您传递的是一个未初始化的(垃圾)值。这会导致未定义的行为。

因此,我建议您更改

char * filename;
scanf("%s",filename);
f(filename);

:

char filename[100];
if ( scanf( "%99s", filename ) == 1 )
f( filename );
在上面的代码中,声明
char filename[100];

将分配一个包含100个字符的数组,它足以存储99个字符和结束的null字符。当将filename传递给scanf时,数组将衰变为指向数组第一个字符地址的指针。

我将scanf函数调用包含在if语句中,因为检查scanf的返回值通常是一个好主意,以确保函数成功。

另外,我使用%99s格式说明符而不是%s来限制输入为99个字符,否则如果用户输入超过99个字符将发生缓冲区溢出。

相关内容

  • 没有找到相关文章

最新更新