You need to enable JavaScript to run this app. C语言Linux环境自定义strrev函数报Expected an identifier错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

C语言Linux环境自定义strrev函数报Expected an identifier错误如何解决

问题原因及修复方案

1 核心错误:头文件保护宏定义错误

你当前的头文件防护逻辑直接把strrev定义为了空宏,导致所有代码里出现strrev的位置都会被预处理器替换为空,直接破坏了函数声明和调用逻辑,这是编译报错的主要原因。

错误的头文件写法:

#if !defined(strrev)
#define strrev // 这里直接把strrev定义为空宏,完全不符合头文件防护的要求
char *strrev(char *str);
#endif

修复后的strrevFunction.h代码:

头文件防护宏需要和函数名区分开,标准写法是使用头文件名全大写加下划线的格式:

#ifndef STRREV_FUNCTION_H
#define STRREV_FUNCTION_H
char *strrev(char *str);
#endif

2 废弃函数风险

你使用的gets()函数已经在C11标准中被正式删除,该函数没有缓冲区长度校验,极易触发内存溢出漏洞,建议替换为fgets()。

主函数代码修改示例:

#include <stdio.h>
#include <string.h>
#include "strrevFunction.h"
int main()
{   
    char string1[30];
    printf("Escribe una frase\n");
    // 替换gets为fgets,指定缓冲区长度避免溢出
    fgets(string1, sizeof(string1), stdin);
    // fgets会读入输入的换行符,可以手动去掉
    size_t len = strlen(string1);
    if (len > 0 && string1[len-1] == '\n') {
        string1[len-1] = '\0';
    }
    strrev(string1);
    printf("Tu frase al reves es: %s\n", string1);
    return 0;
}

3 冗余符号清理

strrevFunction.c中函数定义末尾多了不必要的分号,虽然部分编译器不会报错,但不符合C语法规范,建议删除。

修复后的strrevFunction.c代码:

#include "strrevFunction.h"
#include <stdio.h>
#include <string.h>
char *strrev(char *str)
{
    char *p1, *p2;
    if (! str || ! *str)
        return str;
    for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
    {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
    }
    return str;
}

编译说明

编译时需要把两个C源文件一起参与编译,以gcc为例执行命令:
gcc main.c strrevFunction.c -o reverse_str
运行生成的reverse_str程序即可正常执行。

内容的提问来源于stack exchange,提问作者nehemuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 16:06:02