字符串处理

r11222 2010-04-29 11:27:41
给你一个字符串。

如果是小数,就将数末尾的0清除

如,给你一个字符串 12.345000
因为有一个小数点,所以,是小数,就把末尾的0清除
得到字符串 12.345

如果给你12345000,因为没有小数点,所以,不是小数,不处理,得到字符串12345000

我写了一写,自我感觉很啰嗦很恶心。

求优美高效代码。。。。
...全文
236 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2010-04-29
  • 打赏
  • 举报
回复
转换一下数据类型吧,atof转换成double,然后在sprintf得到字符串即可:

示例:

函数名称: atof
函数原型: double atof(char *str)
函数功能: 将字符串转换成一个双精度数值
函数返回: 转换后的数值
参数说明: str-待转换浮点型数的字符串
所属文件: <stdlib.h>

#include <stdlib.h>
#include <stdio.h>
int main()
{
float f;
char *str="12345.67";
f=atof(str);
printf("string=%s float=%f",str,f);
return 0;
}

函数名称: sprintf
函数原型: int sprintf (char *buffer,const char *format,… )
函数功能: buffer写入的缓冲区
函数返回: 写入的字符数(不包括终止符)
参数说明:
所属文件: <stdio.h>

#include <stdio.h>
#include <math.h>
int main()
{
char buffer[80];
sprintf(buffer,"An approximation of Pi is %f",M_PI);
puts(buffer);
return 0;
}
sbdt123 2010-04-29
  • 打赏
  • 举报
回复
好,学习了
huanmie_09 2010-04-29
  • 打赏
  • 举报
回复

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


char *fun(char *s, char ch);

int main()
{
char s[50] = "12.00100";
printf("s=%s\n", s);
fun(s, '.');
printf("s=%s\n", s);
return 0;
}

char *fun(char *s, char ch)
{
char *p, *q;
int len = strlen(s), i;
p = strchr(s, ch);
if(p == NULL) {
return s;
}
if(*(s+len-1) != '0') {
return s;
}
for(i = len-1; s[i] != *p && s[i] == '0'; i--) {
s[i] = '\0';
}
if(s[i] == *p) {
s[i] = '\0';
}
return s;
}
r11222 2010-04-29
  • 打赏
  • 举报
回复
好像很多人都没有考虑 123.4560000121300的情况
lfxyxy 2010-04-29
  • 打赏
  • 举报
回复
谢谢,学习中。。。。
mywaylgh 2010-04-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

void f(char *s)
{
int i,j;
i=j=strlen(s);
while(s[--i] != '.' && i>0);
while(s[--j] == '0' && j>0);
if (i!=0) s[++j]='\0';
printf("%s\n",s);
}

int main()
{
char a[] = "12.345000";
char b[] = "12345000";
f(a);
f(b);
return 0;
}
ilwmin 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 copperlijian 的回复:]

15 楼的兄弟好像没考虑全面
输入 123.000000
结果 123.
[/Quote]
int main()
{
char str1[]="12345.0000";
if(strchr(str1,'.') != NULL)
{
int len = strlen(str1);
while(str1[len-1]=='0' || str1[len-1]=='.')
{
str1[len-1]='\0';
len--;
}
}
printf("str1=[%s]\n",str1);
return 0;
}
COPPERLIJIAN 2010-04-29
  • 打赏
  • 举报
回复
15 楼的兄弟好像没考虑全面
输入 123.000000
结果 123.
COPPERLIJIAN 2010-04-29
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
char str[100];

int main(void)
{
int flag1,flag2;

int i,len,end;

while(scanf("%s",&str)!=EOF)
{
flag1=1;
flag2=1;
len = strlen(str);

end=len;

for( i = len-1; i >= 0; i--)
{
if(str[i] == '.')
{
flag1=0;
}
if(str[i] == '0' && flag2 == 1)
{
end--;

if(str[i-1] == '.')

end--;

}
else
{
flag2=0;


}
}

if(flag1 == 0)
{
for(i = 0; i < end; i++)
printf("%c", str[i]);
}
else
{
printf("%s", str);
}

printf("\n");
}
return 0;

}
ilwmin 2010-04-29
  • 打赏
  • 举报
回复
int main()
{
char str1[]="12345.8900";
if(strchr(str1,'.') != NULL)
{
int len = strlen(str1);
while(str1[len-1]=='0')
{
str1[len-1]='\0';
len--;
}
}
printf("str1=[%s]\n",str1);
return 0;
}
wangtu105 2010-04-29
  • 打赏
  • 举报
回复
来学习学习。
DemonWhisper 2010-04-29
  • 打赏
  • 举报
回复
char *strip(char *s) {
char *dot = s;
char *zero = NULL;
for (; *dot; ++dot) {
switch (*dot) {
case '.': zero = (char *)1; break;
case '0': if (zero == (char *)1) zero = dot; break;
default: if (zero) zero = (char *)1; break;
}
}
if (zero && zero != (char *)1) *zero = '\0';
return s;
}
Eleven 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualeleven 的回复:]
我也写一个吧:

C/C++ code
#include "stdafx.h"
#include <stdlib.h>

void TranslatForm(TCHAR* pBuf, int nLen)
{
TCHAR* pFlag = _tcschr(pBuf, _T('.'));
if(NULL != pFlag)
{
pFlag ……
[/Quote]
囧,写错了,修正过来
--------------------------------------------
#include "stdafx.h"
#include <stdlib.h>

void TranslatForm(TCHAR* pBuf, int nLen)
{
TCHAR* pFlag = _tcschr(pBuf, _T('.'));

if(NULL != pFlag)
{
TCHAR ch = _T('\0');
for(pFlag = pBuf+nLen-1; pFlag >= pBuf; pFlag--)
{
ch = *pFlag;
if(ch != _T('0'))
{
break;
}
}
pBuf[pFlag-pBuf] = _T('\0');
}

_tprintf(_T("%s\r\n"), pBuf);
}

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR buf1[] = _T("12.003450000");
TCHAR buf2[] = _T("12003450000");

TranslatForm(buf1, _tcslen(buf1));
TranslatForm(buf2, _tcslen(buf2));
return 0;
}
OnMyWay2010 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 we_sky2008 的回复:]
跟一楼的相比,
我的代码实在是太长了
呵呵
[/Quote]
在你的代码的基础上修改了下:

char *func(char *s)
{
char *p = s;
if (s == NULL)
return NULL;
while(*p)
{
if (*p == '.')
break;
p++;
}
if (*p == 0)
return s;
else
{
while(*p)
{
char *pjudge = p;
while(*pjudge++ == '0')
{
if (!*pjudge)
{
(*(p - 1 ) == '.') ? (*(p - 1 ) = 0) : (*p = 0);//必要时去掉.
return s;
}
}
p++;
}
return s;
}
}
Eleven 2010-04-29
  • 打赏
  • 举报
回复
我也写一个吧:
#include "stdafx.h"
#include <stdlib.h>

void TranslatForm(TCHAR* pBuf, int nLen)
{
TCHAR* pFlag = _tcschr(pBuf, _T('.'));
if(NULL != pFlag)
{
pFlag = _tcschr(pFlag, _T('0'));
pBuf[pFlag-pBuf] = _T('\0');
}

_tprintf(_T("%s\r\n"), pBuf);
}

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR buf1[] = _T("12.3450000");
TCHAR buf2[] = _T("123450000");

TranslatForm(buf1, _tcslen(buf1));
TranslatForm(buf2, _tcslen(buf2));
return 0;
}
we_sky2008 2010-04-29
  • 打赏
  • 举报
回复
跟一楼的相比,
我的代码实在是太长了
呵呵
田暗星 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huanmie_09 的回复:]
C/C++ code

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


char *fun(char *s, char ch);

int main()
{
char s[50] = "12.00100";
printf("s=%s\n", s);
fun(s, '.');
……
[/Quote]

好呀好呀
we_sky2008 2010-04-29
  • 打赏
  • 举报
回复
也写了一个,但不知道效率怎么样:

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

char *func(char *s)
{
char *pslow = s;
char *pfast;

if (s == NULL)
return NULL;

while(*pslow)
{
if (*pslow == '.')
break;
pslow++;
}

if (*pslow == 0)
return s;
else
{
pfast = pslow + 1;
while(*pslow)
{
char *pjudge = pslow;
while(*pjudge++ == '0')
{
if (!*pjudge)
{
(*(pslow - 1 ) == '.') ? (*(pslow - 1 ) = 0) : (*pslow = 0);//必要时去掉.
return s;
}
}
*++pslow = *pfast++;
}
return s;
}
}

int main()
{
int i;
char array[][100] =
{
"1226",
"1226.00",
"1226.00123",
"1226.0012300",
"1226.001000101",
"1226.101000101000",
"1226.00000000000000",
};
for (i = 0; i < sizeof (array)/sizeof (array[0]); i++)
printf("%s\n", func(array[i]));

system("pause");
return 0;
}
we_sky2008 2010-04-29
  • 打赏
  • 举报
回复
也写了一个,但不知道效率怎么样:

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

char *func(char *s)
{
char *pslow = s;
char *pfast;

if (s == NULL)
return NULL;

while(*pslow)
{
if (*pslow == '.')
break;
pslow++;
}
pfast = pslow + 1;

if (*pslow == 0)
return s;
else
{
while(*pslow)
{
char *pjudge = pslow;
while(*pjudge++ == '0')
{
if (!*pjudge)
{
(*(pslow - 1 ) == '.') ? (*(pslow - 1 ) = 0) : (*pslow = 0);//必要时去掉.
return s;
}
}
*++pslow = *pfast++;
}
return s;
}
}

int main()
{
int i;
char array[][100] =
{
"1226",
"1226.00",
"1226.00123",
"1226.0012300",
"1226.001000101",
"1226.101000101000",
"1226.00000000000000",
};
for (i = 0; i < sizeof (array)/sizeof (array[0]); i++)
printf("%s\n", func(array[i]));

system("pause");
return 0;
}
databaseboy 2010-04-29
  • 打赏
  • 举报
回复
也来学习一下
加载更多回复(1)

70,037

社区成员

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

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