C语言实现字符串内容对比时出现unary '*' (have 'int')错误如何解决
错误成因
报错的直接触发点是代码中if (*word1[i] != *word2[i])这一行,指针操作逻辑不符合C语法规则:
word1、word2均为char *类型的指针,word1[i]的语义等价于*(word1 + i),本身已经完成了「指针偏移i个单位+解引用取对应字符」的操作,得到的结果是char类型的字符值,在C语言运算时会隐式提升为int类型。- 代码额外添加了一元
*解引用运算符,相当于尝试对一个int类型的普通数值执行仅指针支持的解引用操作,因此编译器抛出invalid type argument of unary ‘*’ (have ‘int’)错误。
修复方案
只需要去掉比较语句中多余的一元*运算符即可,有两种等价的写法可选:
- 写法1:保留数组下标访问的写法,直接比较字符值
if (word1[i] != word2[i])
- 写法2:使用纯指针偏移+解引用的写法,和下标访问逻辑完全等价
if (*(word1 + i) != *(word2 + i))
修复后完整可运行代码
#include <stdio.h> #include <stdlib.h> int stringcompare(char * str1, char * str2, int strSize){ char * word1 = str1; char * word2 = str2; for (int i = 0; i < strSize; i++) { // 去掉多余的*后正常比较 if (word1[i] != word2[i]) { printf("The strings are DIFFERENT!"); return 1; } } printf("The strings are a MATCH!"); return 0; } int main(void){ char * str1 = "Hello World!"; char * str2 = "Hello World!"; stringcompare(str1, str2, 13); }
可选优化点
- 代码中额外定义的
word1、word2指针没有特殊作用,可以直接用入参str1、str2做下标访问,减少冗余变量。 - 如果对比的是标准C风格以
\0结尾的字符串,可以不用传入长度参数,循环中判断是否读到\0即可终止对比,适配动态长度的字符串场景。
内容的提问来源于stack exchange,提问作者civitas3797
相关产品推荐
相关产品推荐

