遍历字符串索引与另一字符串比较并复制字符时遇报错,求解决
问题与解决方案
错误原因分析
编译报错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
相关产品推荐
相关产品推荐

