如何去掉一个字符串中的数字?需要考虑空间和效率。
如题,有个字符串"abc123def456",如何去掉其中的数字,变成"abcdef"。
需要考虑空间和效率问题,例如字符串长度很长的情况下,另外申请数组空间上就不合适。
怎样才能高效的去掉其中的数字呢?
[解决办法]
遍历,是数字就去掉呗.如果有规律就另想办法.
[解决办法]
STL里面的replace
不到符合不
[解决办法]
从后向前,遍历字符,遇到数字就删除
[解决办法]
#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 (IsNumber(*fast) ? *fast++ : *slow++ = *fast++)
;
return src;
}
int main()
{
char src[] = "abcdef1g2h3i45gk6lm7n8";
printf("%s\n", delete_num(src));
system("pause");
return 0;
}
root@~ #cat delnum.c
#include <stdio.h>
int main (void) {
char str[]="sdfsdfasdf234sfsar234324234sadfq234asf23q4";
void delnum (char s[]);
printf ("%s\n",str);
delnum(str);
printf ("%s\n",str);
return 0;
}
void delnum (char s[]) {
int i,j;
for(i=0;s[i]!='\0';i++) {
if(s[i]>='0'&&s[i]<='9') {
for(j=i;s[j]!='\0';j++) {
s[j]=s[j+1];
}
i--;
}
}
}
root@~ #./delnum
sdfsdfasdf234sfsar234324234sadfq234asf23q4
sdfsdfasdfsfsarsadfqasfq
root@~ #
//我的程序,记录位置和数字的长度
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[256]="sdds344sdhs3334dhffd2";
printf("%s\n",str);
int i=0;
int length=strlen(str);
while(str[i]!='\0')
{
//第一个位置满足
if(str[i]>='0'&&str[i]<='9')
{
int sum=1;
//记录位置和长度
while(str[i]!='\0'&&(str[i+1]>='0'&&str[i+1]<='9'))
{
i++;
sum++;
}
//不满足的时候移位
for(int j=i+1;str[j]!='\0';j++)
{
str[j-sum]=str[j];
}
//注意将最后移位设为\0
str[length-sum-1]='\0';
}
i++;
}
printf("%s\n",str);
}
#include <stdio.h>
#include <stdlib.h>
char* function(char *str)
{
char *write,*read;
write=read=str;
while(*read!=0)
{
if( !('0'<=*read && *read<='9') )
{
*write++=*read;
}
++read;
}
*write=NULL;
return str;
}
int main()
{
char buffer[100];
while( scanf("%s",buffer)!=EOF )
{
printf("%s\n",function(buffer));
}
return 0;
}
39 }
40 digFlag = 0;
41 }
42 }
43 if(digFlag == 1)//处理数字在最后的情况
44 {
45 memmove(temp+i,temp+i+digNum,length-i);
46 }
47 *(temp + length)='\0';
[解决办法]
char * ParseUnknowStr_cstrp (char * In_cstrp, char * EndOfIn_cstrp)
{
if ((NULL==In_cstrp)
[解决办法]
(NULL==EndOfIn_cstrp))
{
return NULL;
}
char * CurrentPtr_cstrp= In_cstrp;
EndOfIn_cstrp[0]= 0;
while (CurrentPtr_cstrp<EndOfIn_cstrp)
{
while (0==CurrentPtr_cstrp[0])
{
++CurrentPtr_cstrp;
}
if (CurrentPtr_cstrp<EndOfIn_cstrp)
{
int temp_i= strlen ( CurrentPtr_cstrp);
strcat ( In_cstrp, CurrentPtr_cstrp);
CurrentPtr_cstrp= CurrentPtr_cstrp+ temp_i;
}
}
return In_cstrp;
}
char * KickNumbersOut_cstrp (char * In_cstrp)
{
if ((NULL==In_cstrp)
[解决办法]
(0==In_cstrp[0]))
{
return NULL;
}
int LenOfIn= strlen ( In_cstrp);
char * End_cstrp= In_cstrp+ LenOfIn;//这儿是指向结尾的0
while (0<=LenOfIn)
{
if (('0'<=In_cstrp[LenOfIn])&&(In_cstrp[LenOfIn]<='9'))
{
In_cstrp[LenOfIn]= 0;
}
--LenOfIn;
}
return ParseUnknowStr_cstrp ( In_cstrp, End_cstrp);
}
//比如下面这种情况,将字符'1'之前的字符重新写到原地址处时没有直接跳过效率高,
//所以在copy之前先将指针定位到'1'处然后再copy效率比较高点。
char a[] = "abcdefghigklmnabcdefghigklmnabcdefghigklmnabcdefghigklmn1234567890";
#include<stdio.h>
#include<stdlib.h>
char *delete_num(char *src)
{
char *slow = src, *fast = src;
while (('0' <= *fast && *fast < '9') ? *fast++ : (*slow++ = *fast++));
return src;
}
int main()
{
char src[] = "abcdef1g2h3i45gk6lm7n8";
printf("%s\n", delete_num(src));
system("pause");
return 0;
}
if((byte)((byte)*read - '0') > 9)
#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_of(del,pos))!=string::npos)
{
s.erase(pos,pos);
}
cout<<s<<endl;
return 0;
}
#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;
}
#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; // 返回字符串指针
}
#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; // 返回字符串指针
}
#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;
}