C语言出现declaration shadows a local variable错误该如何修复
警告触发原因
你遇到的declaration shadows a local variable警告是同作用域内重复声明同名变量导致的:
你已经在for循环外定义了存储卡片数量的变量int numberofcards,后续写for ( int i = 0, numberofcards; i < numberofcards ; i++)时,循环初始化语句里的numberofcards相当于在for循环的局部作用域内又定义了一个同名int变量,这个局部变量会覆盖外层你定义的同名变量,因此编译器会触发遮蔽警告。
修复方法很简单:删除for循环里重复声明的numberofcards,直接复用外层变量即可,修改后循环语句为:
for (int i = 0; i < numberofcards; i++)
其他功能异常问题修复
除了警告外,你的代码还有不少用法错误,会导致功能无法正常运行,也需要同步修改:
scanf用法错误scanf的作用是读取用户输入,第一个参数为格式化字符串,你现有写法完全搞反了输出提示和读取输入的逻辑,正确的获取卡片数量的写法为:
同时你先// 先输出提示 printf("How many cards(includes definition and term) do you need: \n"); // 再读取用户输入的数值存入变量 scanf("%d", &numberofcards);fopen(argv[1])打开目标文件,之后又调用scanf("%s", argv[1])修改文件名的逻辑完全多余,会导致后续内容无法写入你指定的文件,这行scanf直接删除即可。- 文件名合法性校验逻辑失效
你写的for (int loop = 0, n=0; loop < n; loop++)中n初始值为0,循环条件一开始就不成立,校验逻辑完全不会执行。正确写法是先获取命令行传入的文件名长度作为循环上限:int n = strlen(argv[1]); for (int loop = 0; loop < n; loop++) - 缺少用户输入读取、文件写入逻辑
现有循环里只打印了提示,没有读取用户输入的术语、释义,也没有把内容写入到文件中,需要补充对应的读取和写入逻辑。
修复后可运行参考代码
#include <stdio.h> #include <ctype.h> #include <string.h> // 如果你使用CS50库保留这行,否则将下面的string替换为char*即可 #include <cs50.h> int main(int argc, string argv[]) { // 校验命令行参数数量 if (argc != 2) { printf("Usage: ./deck name\n"); return 1; } // 校验文件名仅包含字母 int n = strlen(argv[1]); for (int loop = 0; loop < n; loop++) { if (!isalpha(argv[1][loop])) { printf("Usage: ./deck name\n"); return 1; } } // 打开目标文件 FILE *fp = fopen(argv[1], "w"); if (fp == NULL) { printf("文件打开失败\n"); return 1; } // 获取卡片总数 int numberofcards; printf("请问你需要录入多少张卡片(包含术语和释义):\n"); scanf("%d", &numberofcards); // 清空输入缓冲区避免后续读取字符串异常 getchar(); char term[256], definition[1024]; for (int i = 0; i < numberofcards ; i++) { printf("请输入第%d个术语:\n", i+1); fgets(term, sizeof(term), stdin); printf("请输入第%d个术语的释义:\n", i+1); fgets(definition, sizeof(definition), stdin); // 写入内容到文件 fprintf(fp, "术语:%s释义:%s---\n", term, definition); } fclose(fp); return 0; }
内容的提问来源于stack exchange,提问作者Sash Reddy
相关产品推荐
相关产品推荐

