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

遍历字符串索引与另一字符串比较并复制字符时遇报错,求解决

问题与解决方案

错误原因分析

编译报错comparison between pointer and integer ('char' and 'string' (aka 'char *'))的核心原因是类型不匹配:

  • key[i]是单个字符(char类型),而你定义的key2[26]是string(即char*)数组,key2[j]是指向字符的指针,拿字符和指针直接比较就会触发这个错误。
  • 另外代码逻辑还有其他问题:每次循环都重置j=0,只会检查key2的第一个元素;j++缺少分号;key2没有正确初始化和添加字符串终止符,最后printf会出现未定义行为。

修正后的代码

要实现提取原字符串中不重复的字符并保存到新字符串的需求,正确写法如下:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, string argv[])
{
    // 确保传入了合法命令行参数
    if (argc != 2)
    {
        printf("Usage: %s <key>\n", argv[0]);
        return 1;
    }

    string key = argv[1];
    char key2[27] = {0}; // 定义为char数组,26个字符+1个终止符,初始化为0
    int key2_len = 0; // 记录key2当前的有效长度

    for (int i = 0; key[i] != '\0'; i++)
    {
        char current_char = key[i];
        // 检查当前字符是否已在key2中存在
        int exists = 0;
        for (int j = 0; j < key2_len; j++)
        {
            if (key2[j] == current_char)
            {
                exists = 1;
                break;
            }
        }
        // 不存在则添加到key2末尾
        if (!exists)
        {
            key2[key2_len] = current_char;
            key2_len++;
        }
    }

    // 确保字符串终止符存在(初始化已设为0,此处可做双重保障)
    key2[key2_len] = '\0';
    printf("%s\n", key2);
    return 0;
}

关键修正点

  • 将string key2[26]改为char key2[27]:我们需要存储单个字符串而非字符串数组,27的长度是为了容纳26个字符和必须的\0终止符。
  • 新增key2_len变量跟踪新字符串的有效长度,避免无效遍历。
  • 增加内层循环检查字符是否重复,确保只有未出现过的字符才被添加。
  • 补充命令行参数合法性检查,避免无参数时的程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:11:10