我有这样一个函数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个字符将发生缓冲区溢出。