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

凯撒密码程序命令行密钥校验的指针与整数比较错误排查

问题解决:凯撒密码密钥校验的编译错误

错误根源

编译错误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;
}

关键修改说明

  1. 类型匹配修正:将NULL替换为字符常量'\0',确保和array[1][i]的char类型一致;
  2. 循环逻辑修正:把||改为&&,避免死循环,一旦遇到非数字字符或遍历到结尾就终止循环;
  3. 参数判断优化:用argc != 2替代argv[2] != NULL,更直观判断参数数量是否合法;
  4. 代码简洁性提升:使用ctype.h提供的isdigit()函数判断字符是否为数字,替代手动的ASCII值比较,减少出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:35:03