C语言跨函数传递图片文件路径 全局变量无法识别问题求助
问题根因
- 你虽然用
scanf_s读取了用户输入的路径存到filepath局部数组,也把全局指针location指向了这个数组,但调用loadImage的时候根本没传这个读取到的路径,而是传了argv[1](也就是命令行参数里的路径),没有传入命令行参数的情况下自然找不到目标文件。 - 逻辑顺序错误:读取用户输入路径后,你立刻判断
argc != 2就直接返回1退出程序,哪怕用户正确输入了路径也不会走到后续加载逻辑。 scanf_s用法错误:读取字符串时不需要对数组名取地址,同时必须传入缓冲区最大可读长度,你当前的写法存在缓冲区溢出风险。- 全局变量
location完全失效:loadImage函数的形参名就叫location,同名情况下函数内部只会访问形参,全局变量直接被屏蔽,起不到跨函数传值的作用。 - 全局变量本身就没有必要使用,函数间直接传参就可以满足路径传递的需求,还能避免全局变量带来的各类隐患。
修复方案
直接修改main函数即可,无需保留无用的全局location变量:
int main(int argc, char ** argv) { char filepath[99] = {0}; char *load_path = NULL; // 优先使用命令行参数传入的路径,没有则提示用户手动输入 if (argc == 2) { load_path = argv[1]; } else { printf("Enter file path: \n"); // scanf_s读取字符串的正确写法,预留1位存储字符串结束符 scanf_s("%s", filepath, (unsigned int)(sizeof(filepath) - 1)); load_path = filepath; } puts(load_path); setbuf(stdout, 0); numScale = strlen(scale) - 1; printf("ASCII Brightness Scale: %d\n", numScale); image *img = NULL; // 传入实际的加载路径即可 if (loadImage(&img, load_path)) { printf("Image dimensions: %zux%zu\n", img->width, img->height); char buf[1000000]; // 1M空间足够存储常规尺寸的字符画 sprintchar(buf, img); printf("%s", buf); // 放开注释即可在终端输出ASCII字符画 release(img); } return 0; }
如果你不需要支持命令行参数传路径,直接删掉argc相关的判断逻辑,只保留读取用户输入路径的逻辑即可。
内容的提问来源于stack exchange,提问作者EMAROH
相关产品推荐
相关产品推荐

