C语言编译报错‘expected expression before char’,求详细解析
解决C语言编译错误:
expected expression before 'char' 嘿,我来帮你搞定这个编译错误!首先,你遇到的expected expression before 'char'提示,根源在scan函数的这一行:
niz=(char**)realloc(niz,(m+1)*sizeof(*char));
这里的*char是非法语法——char是类型名,你不能直接对它用解引用操作符*。正确的写法有两种:
- 直接写
sizeof(char*),明确表示一个字符指针的大小 - 更推荐用
sizeof(*niz),这样如果以后niz的类型变更,代码不需要手动修改,更健壮
除了这个编译错误,我还发现代码里有几个会导致运行问题的隐患,一起帮你修正:
1. 字符读取的优先级错误
你的while循环条件写反了运算符优先级:
while((c=fgetc(fp)!=EOF)) {
因为!=的优先级比=高,这行代码实际是把fgetc(fp) != EOF的布尔结果(0或1)赋值给c,而不是读取到的字符本身。正确的写法应该把赋值操作括起来:
while( (c = fgetc(fp)) != EOF ) {
2. main函数的闭合括号缺失
你的main函数最后漏掉了一个},导致编译器无法正确识别函数边界,这也会引发奇怪的编译错误,一定要补上。
3. 字符串计数逻辑错误
循环结束后的计数逻辑有问题,比如如果文件里只有一个单词,你的代码会把计数算成-1,这明显不对。原来的判断是:
if(niz[m][0]==0) *n=m; else *n=m-1;
正确的逻辑应该是:如果最后一个分配的字符串非空(也就是循环结束前还在写入字母),那么总数量是m+1;否则是m。修正后:
if(niz[m][0] != 0) *n = m + 1; else *n = m;
4. 字符溢出保护
另外,你分配了每个字符串21个字符的空间(留一个给结束符),所以写入字符时最好加个判断,防止超过20个字符的上限:
if(g < 20) { niz[m][g++]=c; }
修正后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char** scan(FILE *fin, int *n); void sort(char **array, int n); void print(FILE *fout, char **array, int n); int main(int argc, char *argv[]) { FILE *fp,*dat; int n; char **niz; // 新增:检查命令行参数是否足够 if (argc < 3) { fprintf(stderr, "Usage: %s <input-file> <output-file>\n", argv[0]); return 1; } fp=fopen(argv[1],"r"); if (fp == NULL) { perror("Failed to open input file"); return 1; } dat=fopen(argv[2],"w"); if (dat == NULL) { perror("Failed to open output file"); fclose(fp); return 1; } niz=scan(fp,&n); printf("Total words: %d\n", n); sort(niz,n); print(dat,niz,n); fclose(fp); fclose(dat); free(niz); } // 补上main的闭合括号 char** scan(FILE *fp, int *n) { int c,m=0,g=0; char **niz; niz=(char**)calloc(1,sizeof(char *)); niz[0]=(char*)calloc(21,sizeof(char)); while( (c = fgetc(fp)) != EOF ) { // 修正优先级 if((c>64 && c<91) || (c>96 && c<123)) { if(g < 20) { // 防止字符溢出 niz[m][g++]=c; } } else if(niz[m][0]!=0) { m++; g=0; niz=(char**)realloc(niz,(m+1)*sizeof(*niz)); // 修正sizeof错误 niz[m]=(char*)calloc(21,sizeof(char)); } } // 修正计数逻辑 if(niz[m][0] != 0) *n = m + 1; else *n = m; return niz; }
额外提示:你还没实现sort和print函数,编译时会出现警告,不过等你补完这两个函数就好了。另外,我加了命令行参数检查和文件打开失败的错误处理,这样程序更健壮,不会因为用户传错参数或者文件不存在就崩溃。
内容的提问来源于stack exchange,提问作者Mr.Green
相关产品推荐
相关产品推荐

