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
相关产品推荐
相关产品推荐

