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

C语言中从指针复制特定字符的问题求助

嘿,看来你在字符复制这块卡壳了!我来帮你拆解下可能出问题的地方,顺便给你一套可行的解决方案~

先揪出几个容易踩的核心坑

很多人用多级指针和动态字符串的时候都会栽在这些点上:

  • 别搞错string_ptr的解引用:你声明的是char **string_ptr,这是个指向指针的指针,要拿到实际的句子字符串,必须先解引用一次,也就是用*string_ptr来访问。要是直接用string_ptr去遍历,你操作的是指针本身的地址,根本碰不到句子里的字符,这肯定复制不对。
  • 一定要给word分配足够内存:word是个非数组的char指针,默认如果没初始化的话,它指向的是随机内存地址,直接往里面写字符会导致程序崩溃或者内存乱码。正确的做法是先遍历一遍字符串,统计需要复制的字母总数,再用malloc分配对应大小的内存(别忘了多留一个字节存字符串终止符'\0')。
  • 复制时要跟踪索引,最后加终止符:复制字母的时候,得用一个索引变量(比如idx)来记录word当前写到哪个位置了,每复制一个字母就把索引加1。复制完成后,必须给word的最后一个位置赋值'\0',不然它就不是合法的C字符串,后续打印或者使用都会出问题。

给你个完整的示例代码参考

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

// 示例实现is_letter函数(兼容大小写字母判断)
int is_letter(char c) {
    return isalpha((unsigned char)c);
}

int main() {
    char *sentence = "The quick brown fox jumped.";
    char **string_ptr = &sentence; // 模拟你的string_ptr指向目标句子
    
    char *word = NULL;
    int word_length = 0;
    char *current_char = *string_ptr; // 解引用得到实际字符串指针

    // 第一步:统计需要复制的字母数量
    while (*current_char != '\0') {
        if (is_letter(*current_char)) {
            word_length++;
        }
        current_char++;
    }

    // 分配内存,+1是为了存字符串终止符'\0'
    word = (char *)malloc((word_length + 1) * sizeof(char));
    if (word == NULL) {
        // 处理内存分配失败的情况
        perror("Failed to allocate memory for word");
        return 1;
    }

    // 第二步:复制字母到word
    current_char = *string_ptr; // 重置指针到字符串开头
    int idx = 0;
    while (*current_char != '\0') {
        if (is_letter(*current_char)) {
            word[idx++] = *current_char;
        }
        current_char++;
    }
    word[idx] = '\0'; // 关键!添加字符串终止符

    // 测试输出
    printf("Extracted letters: %s\n", word);

    // 别忘了释放内存,避免泄漏
    free(word);
    return 0;
}

额外要检查的细节

  • 你的is_letter函数是不是正确实现了?比如有没有把大写/小写字母都算进去,有没有误把标点、空格当成字母?
  • 有没有处理malloc失败的情况?虽然小概率发生,但养成好习惯很重要。
  • 如果原句子是动态分配的,后续别忘了对应释放内存,避免内存泄漏。

调整后你的字符复制逻辑应该就能正常工作啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:03:40