C++删除字符串中特定的字符,比如空格

hongwenjun 2011-06-10 11:20:21
#include <iostream>
#include <string>
using namespace std;
void del_sp(char *src); // 删除C风格字符串中的空格
void del_sp(string &str); // 重载del_sp,调用C风格的函数
int main()
{
char hl[] = "删 除 空 格Hello world! Hello world! 88 ";
cout << hl << endl;
del_sp(hl);
cout << hl << endl;

string str("删 除 空 格Hello world! Hello world! 88 ");
cout << str << "\n长度" << str.size() << endl;
del_sp(str); //调用重载的 del_sp
cout << str << "\n长度" << str.size() << endl;

return 0;
}

void del_sp(char *src) // 删除C风格字符串中的空格
{
char * fp = src;
while (*src) {
if (*src != ' ') { // 如果不是空格就复制
*fp = *src;
fp++;
}
src++;
}
*fp = '\0' ; //封闭字符串
}

void del_sp(string &str) // 删除string字符串中的空格
{
// 因为str.c_str() 是const的,不能直接修改,
// 所以要复制一个临时的,然后修改后换回去
char tmp[str.size()+1];
memcpy(&tmp, str.c_str(), str.size() + 1);
del_sp(tmp); // 重载del_sp,调用C风格的函数
str = tmp;
}
...全文
1648 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2011-06-11
  • 打赏
  • 举报
回复
#include <iostream>    // 数据流输入/输出
#include <cstdio> // 定义输入/输出函数
#include <cctype> // 字符处理
#include <cstring>

using namespace std;

// 把 16进制字符串转换成 HEX,写到unsigned char数组里
// 原来 "1234567890ABCDEF" 12个字节,现在用6个字节保存 0x1234567890ABCDEF
void str2hex(unsigned char *char_hex , const char *str)
{
int str_size = strlen(str);
int num[str_size];
for (int i = 0; i != str_size; i++) {
if ((str[i] >= '0') && (str[i] <= '9'))
num[i] = str[i] - 48; // 字符0的ASCII值为48 , 也可以 str[i] - '0'
else if ((str[i] >= 'a') && (str[i] <= 'f'))
num[i] = str[i] - 'a' + 10; // 16进制16
else if ((str[i] >= 'A') && (str[i] <= 'F'))
num[i] = str[i] - 'A' + 10;
else
num[i] = 0;
// cout << num[i] << endl; // 测试转换是否成功
}

int hex_size = strlen(str) / 2;
for (int i = 0; i != hex_size; i++) {
char_hex[i] = (num[2*i] << 4) + (num[2*i+1]); // 把 0xF0 和 0x0F 合并成 0XFF
}
}

int main()
{
char str[] = "1234567890ABCDEF";
unsigned char char_hex[strlen(str)/2+1];
str2hex(char_hex, str);
for (int i = 0; i != 8; i++) {
printf("%X ", char_hex[i]);
}
return 0;
}



留着以后备用
hongwenjun 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shi3590 的回复:]

LZ啥编译器,我咋编译不过呢?
[/Quote]

有什么编译错误提示吗, 要C++项目才行,用到 C++ 的重载 和 string

memcpy 在 <string.h>,如果不能编译,加上文件头

#include <string.h>
void *memcpy( void *to, const void *from, size_t count );
shi3590 2011-06-10
  • 打赏
  • 举报
回复
LZ啥编译器,我咋编译不过呢?
hongwenjun 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

想说明什么问题
*fp 是局部指针,这个有问题,而且char tmp[str.size()+1];这样声明也不对,必须要指定长度,不能用未知的变量作为长度
[/Quote]

*fp 是函数里 局部指针,调用的时候才分配内存,调用好,就销毁了,好像没问题

char tmp[str.size()+1]; 也是函数里的 临时字符串, 长度是 调用 fun(str) 时 临时分配的,调用好也就
销毁了,好像没什么问题吧
shi3590 2011-06-10
  • 打赏
  • 举报
回复

void del_sp(string &str) // 删除string字符串中的空格
{
// 因为str.c_str() 是const的,不能直接修改,
// 所以要复制一个临时的,然后修改后换回去
char *tmp=new char[str.size()+1];
memcpy(tmp, str.c_str(), str.size() + 1);
del_sp(tmp); // 重载del_sp,调用C风格的函数
str = tmp;

}
hongwenjun 2011-06-10
  • 打赏
  • 举报
回复
抛砖引玉,自己写的,编译执行没问题,
不知道会不会越界,如果稳定,记录在网上,可以重新代码利用
bdmh 2011-06-10
  • 打赏
  • 举报
回复
想说明什么问题
*fp 是局部指针,这个有问题,而且char tmp[str.size()+1];这样声明也不对,必须要指定长度,不能用未知的变量作为长度
hongwenjun 2011-06-10
  • 打赏
  • 举报
回复
void del_sp(char *src);
也可以改写成 void del_ch(char *src , char ch);
或者 if (*src != ' ') 这里改写下
void del_sp(char *src)    // 删除C风格字符串中的空格
{
char * fp = src;
while (*src) {
if (*src != ' ') { // 如果不是空格就复制
*fp = *src;
fp++;
}
src++;
}
*fp = '\0' ; //封闭字符串
}

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧