凯撒密码程序命令行密钥校验的指针与整数比较错误排查
问题解决:凯撒密码密钥校验的编译错误
错误根源
编译错误error: comparison between pointer and integer ('char' and 'void*')的核心原因是类型不匹配:
array[1][i]是单个字符(char类型),而NULL是指针类型(void*),两者无法直接比较;- 你尝试的
"\0"是字符串字面量,本质是char*指针,同样和char类型不兼容,正确的字符串结束符应该用字符常量'\0'(单引号包裹)。
另外你的循环条件while(array[1][i] != NULL || status == true )存在逻辑问题:||会导致只要status为true,即使遍历到字符串结尾也会无限循环,应该改用&&,仅当未到结尾且当前状态有效时继续循环。
修正后的代码
#include<stdio.h> #include<cs50.h> #include<string.h> #include<stdlib.h> #include<ctype.h> bool verification(string array[]); int main(int argc, string argv[]) { // 用argc判断参数个数更直接,正确情况是仅传入程序名+密钥两个参数 if(argc != 2) { printf("Usage: ./caesar key\n"); return 1; } else if(!verification(argv)) { printf("Usage: ./caesar key\n"); return 1; } else { printf("works\n"); } } // 校验所有字符是否为数字 bool verification(string array[]) { int i = 0; bool status = true; // 修正类型匹配问题,用'\0'判断字符串结尾,同时用&&保证仅在有效状态下继续遍历 while(array[1][i] != '\0' && status) { if(isdigit(array[1][i])) // 直接用ctype.h的isdigit函数更简洁可靠 { i++; } else { status = false; } } return status; }
关键修改说明
- 类型匹配修正:将
NULL替换为字符常量'\0',确保和array[1][i]的char类型一致; - 循环逻辑修正:把
||改为&&,避免死循环,一旦遇到非数字字符或遍历到结尾就终止循环; - 参数判断优化:用
argc != 2替代argv[2] != NULL,更直观判断参数数量是否合法; - 代码简洁性提升:使用
ctype.h提供的isdigit()函数判断字符是否为数字,替代手动的ASCII值比较,减少出错概率。
内容的提问来源于stack exchange,提问作者GhostaNero
相关产品推荐
相关产品推荐

