You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:15:56