C语言程序编译报错求助:scanf格式及数组语法问题
问题分析与修复
针对你代码里的编译器报错和逻辑问题,逐个修正如下:
1. 变量声明与初始化错误
char letters[] = { "kamneri" };:初始化方式错误,若要存储用户输入的单词,应定义足够大的字符数组,比如char letters[8];(最长单词为7个字符,加上字符串结束符'\0'需8个位置)。words[][7] = {...};:缺少类型声明,需写成char words[][8] = {...};,第二维度设为8是为了容纳7字符单词加结束符,同时必须指定char类型。- 变量
i未声明:在main函数开头添加int i;(或在for循环内声明,需支持C99及以上标准)。
2. 输入输出错误
printf字符串不能直接换行,需用\n转义:修改为printf("This is the game\n Your letters are (k,a,n,m,e,r,i)\n");scanf("%s", &letters):数组名letters本身就是指向首元素的指针,无需加&,正确写法为scanf("%s", letters);,且语句末尾需加分号。print("Not valid value");:函数名拼写错误,应为printf。
3. 字符串比较错误
- C语言中不能直接用
==比较字符串,这只会对比指针地址。因要求仅用<stdio.h>,无法使用<string.h>的strcmp,需手动实现字符逐一对比逻辑。 words[][7]写法非法,必须指定具体索引,需遍历words数组的每个元素与输入值对比。
4. 逻辑逻辑调整
你的需求是输入一个单词后检查是否在words数组中,无需循环输入7次,应输入一次后遍历整个words数组匹配。
修正后的完整代码
#include<stdio.h> int main() { char letters[8]; char words[][8] = { "anemik", "kameri", "marine", "minare", "makine", "anemi", "mekan", "krema", "kerim", "inmek", "imkan", "imren", "imran", "erkan", "ekran", "mera", "krem", "mine", "mira", "name", "ekim", "erik", "kim", "nem", "nam", "ani", "kin", "kir" }; int word_count = sizeof(words) / sizeof(words[0]); int is_valid = 0; printf("This is the game\n Your letters are (k,a,n,m,e,r,i)\n"); printf("Enter your word: "); scanf("%s", letters); // 遍历words数组检查匹配 for(int i = 0; i < word_count; i++) { int j = 0; // 手动对比字符串 while(letters[j] == words[i][j] && letters[j] != '\0' && words[i][j] != '\0') { j++; } if(letters[j] == '\0' && words[i][j] == '\0') { is_valid = 1; break; } } if(is_valid) { printf("valid value\n"); } else { printf("Not valid value\n"); } return 0; }
关键说明
- 手动字符串对比:通过循环逐个字符比较,仅当两个字符串所有字符相同且同时到达结束符时,判定为匹配。
- 数组元素计数:用
sizeof(words)/sizeof(words[0])自动获取words元素数量,避免硬编码。 - 输入处理:
scanf("%s", letters)自动读取到空格或换行,适配单个单词输入,同时确保数组大小足够避免溢出。
内容的提问来源于stack exchange,提问作者AKRU
相关产品推荐
相关产品推荐

