如何去掉一个字符串中的数字?需要考虑空间和效率。

ameyume
博客专家认证
2011-04-02 05:45:20
如题,有个字符串"abc123def456",如何去掉其中的数字,变成"abcdef"。
需要考虑空间和效率问题,例如字符串长度很长的情况下,另外申请数组空间上就不合适。
怎样才能高效的去掉其中的数字呢?
...全文
2399 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenghou1002 2013-09-26
  • 打赏
  • 举报
回复
我觉得33楼的很好!。。
lyqf365 2011-04-10
  • 打赏
  • 举报
回复
不开辟空间的话,只能在原数组下移动了。
可以用两个指针来做,第一个指针指到要移到的位置,第二个指针指到要移动的字符,遇到数字就只移动后一个指针而不copy到前一个位置。这样每个字符最多移动一次。
而且在第一个数字出现后,后面的字符也是至少要移动一次的。
我想不到更好的办法了……
huacong20082009 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]

在C中的话,就简单了:

char a[100] = { 0 };
sscanf( "abc123def456", "%[^0123456789]", a );
[/Quote]

这个方法不行的,只能读出abc
可乐崽 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]
在C中的话,就简单了:

char a[100] = { 0 };
sscanf( "abc123def456", "%[^0123456789]", a );
[/Quote]正解
Ping_QC 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 lovestefanie 的回复:]

引用 6 楼 supermegaboy 的回复:
在C中的话,就简单了:

char a[100] = { 0 };
sscanf( "abc123def456", "%[^0123456789]", a );

王道
[/Quote]

做了1千万次试验sscanf用时4000+ms
我的代码800+ms
Ping_QC 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 ping_qc 的回复:]

C/C++ code

#include <stdio.h>
#define SIZE 10000
int main(){
char s[SIZE];
int i, j;
while(gets(s)){
for(i = j = 0; s[i]; i++){
if(s[i] >= '0' && s[i] <= '9'……
[/Quote]
时间复杂度应该是O(n)吧,不会算
空间复杂度也降到最低了。没有用辅助数组
Ping_QC 2011-04-06
  • 打赏
  • 举报
回复

#include <stdio.h>
#define SIZE 10000
int main(){
char s[SIZE];
int i, j;
while(gets(s)){
for(i = j = 0; s[i]; i++){
if(s[i] >= '0' && s[i] <= '9'){//是数字
;
}else{
s[j++] = s[i];//j是指遍历到当前位置i时出现的字母个数
}
}
s[j] = 0;
printf("%s\n",s);
}
return 0;
}
海涛 2011-04-06
  • 打赏
  • 举报
回复
16楼效率很好,25楼 很会将其精简啊。
G_Spider 2011-04-05
  • 打赏
  • 举报
回复
16楼的,再加上后面的润色,已经很好了。
lovestefanie 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]
在C中的话,就简单了:

char a[100] = { 0 };
sscanf( "abc123def456", "%[^0123456789]", a );
[/Quote]
王道
某某9 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]

在C中的话,就简单了:

char a[100] = { 0 };
sscanf( "abc123def456", "%[^0123456789]", a );
[/Quote]
%[^...]没有那么智能啊亲
drole 2011-04-05
  • 打赏
  • 举报
回复
用链表方便删除
ameyume 2011-04-05
  • 打赏
  • 举报
回复
多谢各位,看了16楼的方法以及后面的解释,终于明白了。非常感谢各位。
lemon2007 2011-04-05
  • 打赏
  • 举报
回复
#include<iostream.h>
#include<string.h>
main()
{
char s[50];
int i,j;
while(1)
{
cout<<"input a string:";
cin>>s;
i=strlen(s);j=0;
while(j<i)
{
if(s[j]>='0'&&s[j]<='9')
{
strcpy(&s[j],&s[j+1]);
i=strlen(s);
}
else j++;
}
cout<<s<<endl;

}

}
hongwenjun 2011-04-05
  • 打赏
  • 举报
回复
30 楼的有点问题,完成的结果有问题。还是16楼的 代码清晰点

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

char* remove_number(char *str);

int main()
{
char buffer[100]="abc123def456_abc123def456_abc123def456";
string s=(buffer);
string del("0123456789");
string::size_type pos=0;
while((pos=s.find_first_of(del,pos))!=string::npos) {
s.erase(pos,pos);
}

printf("%s\n", remove_number(buffer));
cout<<s<<endl;

return 0;
}

// 删除C风格字符串中的数字
char* remove_number(char *str)
{
char *write, *read;
write = read = str; // 三个指针指向原来的字符串
while (*read != 0) { // 当指针指向的字符不是字符串结尾

if (!('0' <= *read && *read <= '9')) { // 如果是数字
*write++ = *read; // 后一个字符填充前一个字符,这里还没有完全理解
}
++read;
}
*write = NULL; // 封闭字符串
return str; // 返回字符串指针
}




hongwenjun 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 heartgoon2010 的回复:]

C/C++ code
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s="abc123def456";
string del("0123456789");
string::size_type pos=0;
while((pos=s.find_first_o……
[/Quote]

STL 的也不错
hongwenjun 2011-04-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

char* remove_number(char *str);

int main()
{
char buffer[100];
while (scanf("%s", buffer) != EOF) {
printf("%s\n", remove_number(buffer));
}
return 0;
}

// 删除C风格字符串中的数字
char* remove_number(char *str)
{
char *write, *read;
write = read = str; // 三个指针指向原来的字符串
while (*read != 0) { // 当指针指向的字符不是字符串结尾

if (!('0' <= *read && *read <= '9')) { // 如果是数字
*write++ = *read; // 后一个字符填充前一个字符,这里还没有完全理解
}
++read;
}
*write = NULL; // 封闭字符串
return str; // 返回字符串指针
}
pure555 2011-04-05
  • 打赏
  • 举报
回复

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

#define IsNumber(a) (('0' <= (a)) && ((a) <= '9'))

char *delete_num(char *src)
{
char *slow;
char *fast;

if(NULL == src)
return NULL;

fast = src;
while(*fast && !IsNumber(*fast))
fast++;
slow = fast;
while(*fast != '\0') {
if(IsNumber(*fast)) {
*fast++;
}
else {
*slow++ = *fast++;
}
}
*slow = '\0';
return src;
}

int main(void)
{
char src[] = "abcdeflg35454k6lm7n8";
printf("%s\n",delete_num(src));
return 0;
}



编译通过
codinghom 2011-04-03
  • 打赏
  • 举报
回复
数据结构… 学习学习
mstlq 2011-04-03
  • 打赏
  • 举报
回复
楼主用16楼的办法吧……
stl里面的remove算法就是那样搞的……
加载更多回复(28)

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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