如何将字符串中的大写字母排在小写字母前面 保持原来次序

时间:2022-02-14 09:16:31
如何将字符串中的大写字母排在小写字母前面 保持原来次序????只要一个循环,而且不要额外分配内存空间,怎么做啊?????????????????????????????

19 个解决方案

#1


用字母对应的ASCII码进行排序。。。

#2


举个例子先。

#3



假设str为你的那个字符串 islower为判断是不是小写字母,isupper判断是不是大写字母,都是api

for(int i=0; i<n; ++i)
if(islower(str[i]))
   str[i] -= 32;
else if(isupper(str[i]))
   str[i] += 32;

#4


楼上各位都没有理解楼主的意思就发表高见了。。。。

#5


楼主是作业题,好像 问题没有说清楚

楼上是把 字母大小写反过来

#6


这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

#7


引用 6 楼 mstlq 的回复:
这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

我都没看懂 有什么要求

#8


引用 7 楼 hongwenjun 的回复:
引用 6 楼 mstlq 的回复:

这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

我都没看懂 有什么要求

就是诸如将“qGrWfUs”变成“GWUqrfs"之类……

#9


我理解是将“qQsSwW”变成“QqSsWw"……

#10


aAbBcC --> ABCabc?

#11


那不就是一次排序就完了么?

#12


有个思路:
1.遍历所有元素,小写的存到 a, 大写存到b, 然后b+a。。。不过 这个 违背了 不开辟空间的要求。

2.不开辟空间。如aAbBcC 字符串,遍历一遍,依次把小写字母放到最后去,其他所有字母向前移一位。
for(i=0;i!=5;i++)
{
   if(a[i]>=97)
      {
        int j = i; x = a[i];
         while(j<=4)
           {
             a[j]=a[j+1];
              ++j;
           }
      }
}

不过这里 就有了for 和while 两个循环了。。又违背 要求了。。

没辙了。。阿门

#13


引用 12 楼 jacicson1987 的回复:
for(i=0;i!=5;i++)
{
  if(a[i]>=97)
  {
  int j = i; x = a[i];
  while(j<=4)
  {……


不对不对。我这个代码 大错特错了。。。。不能看不能看。

#14


引用 12 楼 jacicson1987 的回复:
有个思路:
1.遍历所有元素,小写的存到 a, 大写存到b, 然后b+a。。。不过 这个 违背了 不开辟空间的要求。

2.不开辟空间。如aAbBcC 字符串,遍历一遍,依次把小写字母放到最后去,其他所有字母向前移一位。
for(i=0;i!=5;i++)
{
  if(a[i]>=97)
  {
  int j = i; x = a[i];
  while(j<=4)
  {……


我这个代码 大错特错了。。 不能看 不能看。。

#15


居然不能连续发帖3次。。。

#16



#include <iostream>
#include <string>
using namespace std;
int main()
{
string a = "aaaabBcCDDcsdsdfdDSsSdfD";
cout << a << endl;
int i = 0, n = 0;
int size = a.size();
cout<< size <<endl;
while(i <= size-1-n)
{
if(a[i]>=97)
{
int j = i;
char x = a[i];
while( j <= (size-2))
{
a[j] = a[j+1];
++j;
}
a[size-1]=x;
++n;
}
else ++i;
}
cout << a << endl;
}


这个代码能用了。。VS2008 编译 运行成功鸟。。。
不过 还是没能满足要求, 循环 嵌套 了。。 LZ能用就用,不能用拉到。

#17


运行结果
如何将字符串中的大写字母排在小写字母前面 保持原来次序

#18



include "ctype.h"

void case_sort_impl(const char* rsz, char** plwsz, char** lupsz)
{
    char c = (*rsz);

    if (c == 0)
    {
        --(*plwsz);
        return;
    }

    if (islower(c))
    {
        ++(*plwsz);
        case_sort_impl(++rsz, plwsz, lupsz);
        (**plwsz) = c;
        --(*plwsz);
    }
    else
    {
        (**lupsz) = c;
        ++(*plwsz);
        ++(*lupsz);
        case_sort_impl(++rsz, plwsz, lupsz);
    }
}

void case_sort(char sz[])
{
    char* plwsz = sz;
    char* pupsz = sz;
    case_sort_impl(sz, &plwsz, &pupsz);
}

int main()
{
    char sz[128];
    printf("enter the string : ");
    gets(sz);
    case_sort(sz);
    printf(" after case sort : %s\n", sz);

    return 0;
}


enter the string : abCdeFGHIjklmNopQ
 after case sort : CFGHINQabdejklmop
请按任意键继续. . .

#19


用qsort函数

#1


用字母对应的ASCII码进行排序。。。

#2


举个例子先。

#3



假设str为你的那个字符串 islower为判断是不是小写字母,isupper判断是不是大写字母,都是api

for(int i=0; i<n; ++i)
if(islower(str[i]))
   str[i] -= 32;
else if(isupper(str[i]))
   str[i] += 32;

#4


楼上各位都没有理解楼主的意思就发表高见了。。。。

#5


楼主是作业题,好像 问题没有说清楚

楼上是把 字母大小写反过来

#6


这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

#7


引用 6 楼 mstlq 的回复:
这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

我都没看懂 有什么要求

#8


引用 7 楼 hongwenjun 的回复:
引用 6 楼 mstlq 的回复:

这题是谁出给楼主的?
要么多几次循环,要么视字符串长度分配空间,楼主那么苛刻的要求,我算是没法子了

我都没看懂 有什么要求

就是诸如将“qGrWfUs”变成“GWUqrfs"之类……

#9


我理解是将“qQsSwW”变成“QqSsWw"……

#10


aAbBcC --> ABCabc?

#11


那不就是一次排序就完了么?

#12


有个思路:
1.遍历所有元素,小写的存到 a, 大写存到b, 然后b+a。。。不过 这个 违背了 不开辟空间的要求。

2.不开辟空间。如aAbBcC 字符串,遍历一遍,依次把小写字母放到最后去,其他所有字母向前移一位。
for(i=0;i!=5;i++)
{
   if(a[i]>=97)
      {
        int j = i; x = a[i];
         while(j<=4)
           {
             a[j]=a[j+1];
              ++j;
           }
      }
}

不过这里 就有了for 和while 两个循环了。。又违背 要求了。。

没辙了。。阿门

#13


引用 12 楼 jacicson1987 的回复:
for(i=0;i!=5;i++)
{
  if(a[i]>=97)
  {
  int j = i; x = a[i];
  while(j<=4)
  {……


不对不对。我这个代码 大错特错了。。。。不能看不能看。

#14


引用 12 楼 jacicson1987 的回复:
有个思路:
1.遍历所有元素,小写的存到 a, 大写存到b, 然后b+a。。。不过 这个 违背了 不开辟空间的要求。

2.不开辟空间。如aAbBcC 字符串,遍历一遍,依次把小写字母放到最后去,其他所有字母向前移一位。
for(i=0;i!=5;i++)
{
  if(a[i]>=97)
  {
  int j = i; x = a[i];
  while(j<=4)
  {……


我这个代码 大错特错了。。 不能看 不能看。。

#15


居然不能连续发帖3次。。。

#16



#include <iostream>
#include <string>
using namespace std;
int main()
{
string a = "aaaabBcCDDcsdsdfdDSsSdfD";
cout << a << endl;
int i = 0, n = 0;
int size = a.size();
cout<< size <<endl;
while(i <= size-1-n)
{
if(a[i]>=97)
{
int j = i;
char x = a[i];
while( j <= (size-2))
{
a[j] = a[j+1];
++j;
}
a[size-1]=x;
++n;
}
else ++i;
}
cout << a << endl;
}


这个代码能用了。。VS2008 编译 运行成功鸟。。。
不过 还是没能满足要求, 循环 嵌套 了。。 LZ能用就用,不能用拉到。

#17


运行结果
如何将字符串中的大写字母排在小写字母前面 保持原来次序

#18



include "ctype.h"

void case_sort_impl(const char* rsz, char** plwsz, char** lupsz)
{
    char c = (*rsz);

    if (c == 0)
    {
        --(*plwsz);
        return;
    }

    if (islower(c))
    {
        ++(*plwsz);
        case_sort_impl(++rsz, plwsz, lupsz);
        (**plwsz) = c;
        --(*plwsz);
    }
    else
    {
        (**lupsz) = c;
        ++(*plwsz);
        ++(*lupsz);
        case_sort_impl(++rsz, plwsz, lupsz);
    }
}

void case_sort(char sz[])
{
    char* plwsz = sz;
    char* pupsz = sz;
    case_sort_impl(sz, &plwsz, &pupsz);
}

int main()
{
    char sz[128];
    printf("enter the string : ");
    gets(sz);
    case_sort(sz);
    printf(" after case sort : %s\n", sz);

    return 0;
}


enter the string : abCdeFGHIjklmNopQ
 after case sort : CFGHINQabdejklmop
请按任意键继续. . .

#19


用qsort函数

#20