繁体   English   中英

我有一个将字符串作为参数的函数。v手动输入字符串有效,但使用 scanf 无效

[英]I have a function that takes a string as a parameter.vManually inputing a string works however using a scanf doesn't

所以我有这个函数,如下f(char * str) 字符串参数是使用另一个函数访问的文件名。 所以如果我做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 个字符和终止空字符。 filename传递给scanf ,数组将衰减为指向数组第一个字符地址的指针。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM