求教!急!如何对字符串中数值按升序排序?

nigula99 2011-06-12 12:07:26
一个字符串由多个数字字符串和空格组成,如: char *str="33 4 21 -9 ";
请编写函数sortNumStr,将字符串中数字字符串按数值大小升序排序,组成新的字符串:返回结果:"-9 4 21 33"
...全文
525 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我的理解:先分别转换为字符串或字符数组。求各自的值,排序即可!
nigula99 2011-06-13
  • 打赏
  • 举报
回复
把itoaw带进去 管用啊 多谢了兄弟!
qq120848369 2011-06-13
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b)
{
const int *p=(const int *)a;
const int *q=(const int *)b;

if(*p<*q)
{
return -1;
}
else if(*p==*q)
{
return 0;
}
else
{
return 1;
}
}

const char *str="33 4 21 -9";

int convert(int *out,const char *in)
{
int count = 0;

while(sscanf(in,"%d",out)!=EOF)
{
++count;

while(*in!=0 && *in!=' ') //mark,上边这里越界访问了..
{
++in;
}

while(*in==' ')
{
++in;
}

++out;
}

return count;
}

/*
_CRTIMP void __cdecl qsort(void*, size_t, size_t,
int (*)(const void*, const void*));
*/

int main()
{
int output[100];

int count=convert(output,str);

qsort(output,sizeof(int),count,cmp);

for(int i=0;i<count;++i)
{
printf("%d ",output[i]);
}

return 0;
}
qq120848369 2011-06-13
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b)
{
const int *p=(const int *)a;
const int *q=(const int *)b;

if(*p<*q)
{
return -1;
}
else if(*p==*q)
{
return 0;
}
else
{
return 1;
}
}

const char *str="33 4 21 -9";

int convert(int *out,const char *in)
{
int count = 0;

while(sscanf(in,"%d",out)!=EOF)
{
++count;

while(*in!=' ')
{
++in;
}

while(*in==' ')
{
++in;
}

++out;
}

return count;
}

/*
_CRTIMP void __cdecl qsort(void*, size_t, size_t,
int (*)(const void*, const void*));
*/

int main()
{
int output[100];

int count=convert(output,str);

qsort(output,sizeof(int),count,cmp);

for(int i=0;i<count;++i)
{
printf("%d ",output[i]);
}

return 0;
}
newfarmerchi 2011-06-13
  • 打赏
  • 举报
回复
或者你还用那些头文件但重写了itoa变成itoaw。
你把这个函数带进去试试。
char *itoaw(int num, char *str, int radix)
{
if(num==0)
{
str[0]='0';str[1]='\0';
return str;
}
char string[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char* ptr = str;
int i; int j;
int value=num;
if(num<0) num=-num;
while (num>=radix)
{
*ptr++ = string[num % radix];
num /= radix;
}
if (num)
{
*ptr++ = string[num];
*ptr = '\0';
}
int n=j= ptr-str-1;
for (i=0; i <(ptr - str) / 2; i++)
{
int temp = str[i]; str[i] = str[j]; str[j--] = temp;
}
if(value<0)
{
for(j=n;j>=0;--j) str[j+1]=str[j];
str[0]='-';
}
str[n+2]='\0';
return str;
}
即itoa用itoaw代替。

newfarmerchi 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nigula99 的回复:]
linux gcc
[/Quote]
可能是不同的编译器的事。
在vc6上结果是
-9 4 21 33
Press any key to continue
nigula99 2011-06-13
  • 打赏
  • 举报
回复
linux gcc
newfarmerchi 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nigula99 的回复:]
敢问"newfarmerchi"仁兄,为何itoa函数我这不能用啊,提示这个错误“/tmp/ccA1cmvW.o(.text+0x1bc): In function `sortNumStr':
: undefined reference to `itoa'
collect2: ld returned 1 exit status”,还望告知,多谢
[/Quote]
检查一下头文件是否使用。
你用的什么编译器?我用的是vc6。
nigula99 2011-06-13
  • 打赏
  • 举报
回复
敢问"newfarmerchi"仁兄,为何itoa函数我这不能用啊,提示这个错误“/tmp/ccA1cmvW.o(.text+0x1bc): In function `sortNumStr':
: undefined reference to `itoa'
collect2: ld returned 1 exit status”,还望告知,多谢
yyg990441 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lthyxy 的回复:]
stringstream fuck;
fuck << f.c_str();
int g[100];
int q = 0;
while(fuck >> g[q]) ++q;
sort(g,g+q);
//仅供参考.
[/Quote]
您没注意到这里不是C++区吗?
liutengfeigo 2011-06-12
  • 打赏
  • 举报
回复
stringstream fuck;
fuck << f.c_str();
int g[100];
int q = 0;
while(fuck >> g[q]) ++q;
sort(g,g+q);
//仅供参考.
jilonglv 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nigula99 的回复:]
一楼的兄弟 我的思路也是这样的 但是如何把字符串转换为数字呢 望赐教
[/Quot
size_t toSize_t(char *arr,int num)
{
size_t ret1,ret = 0;
char* arr_temp =new char[num];
for(int i=0;i<num;i++)
{
arr_temp[i] = arr[i];
}
for(int i=num;i != 0;i--)
{
ret1 = 0;
arr_temp[i-1] >>= 4;
arr[i-1] &= 0x0f;
ret1 = arr_temp[i-1];

ret1 <<= 4;
ret1 |= arr[i-1];
if(i != num)
ret <<= 8;
ret |= ret1;
}
cout<<endl;
delete[]arr_temp;
return ret;
}
e]
我刚写了一个,有点丑陋,不过可以用,调用是是这样的:
比如字符串 char str = "12 21";
调用toSize_t(str,2)之后变成了 数字2112,
你在这个上面改改就好了。。。。
nigula99 2011-06-12
  • 打赏
  • 举报
回复
一楼的兄弟 我的思路也是这样的 但是如何把字符串转换为数字呢 望赐教
蓝染忽右介 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sduxiaoxiang 的回复:]

分解为数字字符串数组,转化为数字,排序,再根据排序好的拼接成为新的字符串
[/Quote]++
sduxiaoxiang 2011-06-12
  • 打赏
  • 举报
回复
分解为数字字符串数组,转化为数字,排序,再根据排序好的拼接成为新的字符串
蓝染忽右介 2011-06-12
  • 打赏
  • 举报
回复

楼主可以结贴了!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sortNumStr(char st[]);
int main ()
{
char str[]="33 4 21 -9 ";
sortNumStr(str);
return 0;
}

void sortNumStr(char st[])
{
char str1[100]={0};
char s[10];
char *p;
int a[10];
int i=0, j, k, temp;

p=strtok(st," ");

while (p!=NULL)//分解
{
a[i++] = atoi(p);
p=strtok(NULL," ");
}
for (j=0; j<i-1;++j)//排序
for (k=0; k<i-1-j; ++k)
{
if (a[k]>a[k+1])
{
temp= a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
for (j=0; j<i; ++j)//变回来
{
itoa(a[j],s,10);
strcat(str1,s);
strcat(str1," ");
}
printf("%s\n", str1);

}
newfarmerchi 2011-06-12
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sortNumStr(char st[]);
int main ()
{
char str[]="33 4 21 -9 ";
sortNumStr(str);
return 0;
}

void sortNumStr(char st[])
{
char str1[100]={0};
char s[10];
char *p;
int a[10];
int i=0, j, k, temp;

p=strtok(st," ");

while (p!=NULL)//分解
{
a[i++] = atoi(p);
p=strtok(NULL," ");
}
for (j=0; j<i-1;++j)//排序
for (k=0; k<i-1-j; ++k)
{
if (a[k]>a[k+1])
{
temp= a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
for (j=0; j<i; ++j)//变回来
{
itoa(a[j],s,10);
strcat(str1,s);
strcat(str1," ");
}
printf("%s\n", str1);

}






hackbuteer1 2011-06-12
  • 打赏
  • 举报
回复
楼主可以结帖了
hackbuteer1 2011-06-12
  • 打赏
  • 举报
回复
这个可以实现的。。。。
#include "stdio.h"  
#include "stdlib.h"
#include "string.h"
int b[1000];
int FindAndSum(char *str) // 求和函数
{
int len,i,j,k,a[10000],temp,t,p;
len=strlen(str);
p=0;
for(i=0,j=0;i<len;i++)
{
if(str[i]>='0' && str[i]<='9')
{
if(str[i-1]=='-')
a[j++]=-1*(str[i]-'0');
else
a[j++]=str[i]-'0';
if(i==len-1)
{
b[p]=0;
for(k=0;k<j;k++)
{
temp=1;
for(t=1;t<=j-1-k;t++) // 求权相加
temp*=10;
b[p]+=a[k]*temp;
}
p++,j=0;
}
}
else
{
if(i-1>=0 && str[i-1]>='0' && str[i-1]<='9')
{
b[p]=0;
for(k=0;k<j;k++)
{
temp=1;
for(t=1;t<=j-1-k;t++) // 求权相加
temp*=10;
b[p]+=a[k]*temp;
}
p++,j=0;
}
}
}
return p;
}
int main(void)
{
int num,i,j,temp;
char *str="33 4 21 -9";
num=FindAndSum(str);
for(i=0;i<num;i++)
{
for(j=i+1;j<num;j++)
{
if(b[j]<b[i])
{
temp=b[j];
b[j]=b[i];
b[i]=temp;
}
}
}
for(i=0;i<num;i++)
printf("%d ",b[i]);
printf("\n");
system("pause");
return 0;
}
syai 2011-06-12
  • 打赏
  • 举报
回复
要不你可以试试用strcmp()函数
将字符串分解出来:“33”“4”“21”“-9”用strcmp()来比较排序(快速排序等)然后经他遍历一遍用
“.”将小于“.”的序列倒过来

69,374

社区成员

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

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