高手进,C语言,字符串操作

eagle200901 2010-06-25 10:11:51
如何将 char a[ ]="222.689.486.431" 这个字符串,变为 char b[ ]="222.689.486.430" ? 也就是把字符串中最后的 431减去1,然后保存到 char b[ ] 中,输出?帮帮忙,谢谢!
...全文
144 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zwfgdlc 的回复:]
看格式应该是IP地址,只不过楼主是随便写几个数字举个例子。
[/Quote]
也有可能。。。
lx_616_at_yeah_net 2010-06-26
  • 打赏
  • 举报
回复


#include <stdio.h>

int main(void)
{
char a[ ]="222.689.486.431";

if( !(a[sizeof(a)-2] < 49 || a[sizeof(a)-2] > 57) )
{
--a[sizeof(a)-2];
}

puts(a);

return 0;
}
alangsos 2010-06-26
  • 打赏
  • 举报
回复
楼上没有考虑进位情况,我正面只考虑最后不为0情况,比如420 减1 就是419,如果是0只能为-1了,不过可以修改向前进位
#include "stdafx.h"
#include <string.h>
#include <STDLIB.H>
int main(int argc, char* argv[])
{
char a[ ]="222.689.486.420";
char newa[20]={0};
int num;
int pos=0;
int len=strlen(a);
char last[10]={0};
for( int i=0;i<len;i++ )
if( a[i]=='.')pos=i; //查找最后一个"."
strcpy(last,a+pos+1); //复制字符串420到last来
a[pos+1]='\0'; //把原来字符后面".420"去掉,a就变成222.689.486.
num=atoi(last);//转换为数字
num--; //减1
sprintf(newa,"%s%d",a,num); //合并新的 "222.689.486." + "419"


printf(newa);
return 0;
}

zwfgdlc 2010-06-26
  • 打赏
  • 举报
回复
看格式应该是IP地址,只不过楼主是随便写几个数字举个例子。
Eleven 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zwfgdlc 的回复:]
估计楼主说的字符串是个IP地址。
如果是,直接用winsock里的函数解决即可。

C/C++ code

#include <Winsock2.h>
IN_ADDR IpAddr;
IpAddr.S_un.S_addr = inet_addr("192.168.10.158");
IpAddr.S_un.S_un_b.s_b4 -= 1; //158-1=……
[/Quote]
如果是IP地址的话,应该每个数不大于255,。。。
zwfgdlc 2010-06-26
  • 打赏
  • 举报
回复
估计楼主说的字符串是个IP地址。
如果是,直接用winsock里的函数解决即可。

#include <Winsock2.h>
IN_ADDR IpAddr;
IpAddr.S_un.S_addr = inet_addr("192.168.10.158");
IpAddr.S_un.S_un_b.s_b4 -= 1; //158-1=157
MessageBoxA(NULL, inet_ntoa(IpAddr), inet_ntoa(IpAddr), MB_ICONASTERISK);
lx_616_at_yeah_net 2010-06-26
  • 打赏
  • 举报
回复
楼上发的是C++吧~楼主要求的是C语言~
sizeof是编译时,已经计算好的,应该比strlen函数快多了~
Eleven 2010-06-26
  • 打赏
  • 举报
回复
如果最后一个数大于1,直接这样就可以了
char a[] = "222.689.486.431";
a[strlen(a)-1] -= 1;
Eleven 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zwfgdlc 的回复:]
引用 2 楼 jbz001 的回复:
上面的有误,应该这样。

C/C++ code

char *p;
int len=strlen(a);
p+=len-1;
*p--

如果最后面那个是0怎么办.
[/Quote]
是啊,如果最后一个数是0,那该按照什么规则运算???
Falconapollo 2010-06-26
  • 打赏
  • 举报
回复
如何将 char a[ ]="222.689.486.431" 这个字符串,变为 char b[ ]="222.689.486.430" ? 也就是把字符串中最后的 431减去1,然后保存到 char b[ ] 中
答:VC 6.0下编译通过
#include <iostream>
using namespace std;
int main()
{
char a[ ]="222.689.486.431";
int len = strlen(a);
char *b = new char[len + 1];
b = a;
if(b[len - 1] >= 49 && b[len - 1] <= 57)
--b[len - 1];
cout << "b = " << b << endl;
delete [] b;
return 0;
}
zhupf52 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualeleven 的回复:]

引用 8 楼 zwfgdlc 的回复:
看格式应该是IP地址,只不过楼主是随便写几个数字举个例子。

也有可能。。。
[/Quote]
eagle200901 2010-06-26
  • 打赏
  • 举报
回复
zwfgdlc的回答,给了我灵感....
skywalker119 2010-06-26
  • 打赏
  • 举报
回复
char a[]="222.689.486.430";

int len=strlen(a);

if(a[len-1]>=49 && a[len-1]<=57)
{
--a[len-1];
}
puts(a);
lx_616_at_yeah_net 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 alangsos 的回复:]

楼上没有考虑进位情况,我正面只考虑最后不为0情况,比如420 减1 就是419,如果是0只能为-1了,不过可以修改向前进位
#include "stdafx.h"
#include <string.h>
#include <STDLIB.H>
int main(int argc, char* argv[])
{
char a[ ]="222.689.486.420";
char n……
[/Quote]
你这写得好乱,不太明白你想要考虑的是什么情况!!!
下边是乱猜的。。。


// 这也是11楼的方法,我不过是把它写完整而以

#include <stdio.h>

int main(void)
{
char a[]="222.689.486.420";
unsigned int uInt[4] = {0};

sscanf(a, "%u.%u.%u.%u", &uInt[0], &uInt[1], &uInt[2], &uInt[3]);
sprintf(a, "%u.%u.%u.%u", uInt[0], uInt[1], uInt[2], --uInt[3]);
puts(a);

return 0;
}
partime 2010-06-26
  • 打赏
  • 举报
回复
sscanf(a,"%d.%d.%d.%d",&v1,&v2,&v3,&v4);
c4--;
sprintf(a,,"%d.%d.%d.%d",v1,v2,v3,v4);
zwfgdlc 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jbz001 的回复:]
上面的有误,应该这样。

C/C++ code

char *p;
int len=strlen(a);
p+=len-1;
*p--
[/Quote]
如果最后面那个是0怎么办.
jbz001 2010-06-25
  • 打赏
  • 举报
回复
上面的有误,应该这样。

char *p;
int len=strlen(a);
p+=len-1;
*p--
jbz001 2010-06-25
  • 打赏
  • 举报
回复
char *p;
int len=strlen(a);
p+=len;
*p--;

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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