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
相关产品推荐
相关产品推荐

