题干如下:
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:

blue
red
yellow
green
purple #

输出样例:

red blue green yellow purple

.
.
.
本题需要解决以下几个问题:
**①如何一直输入字符串直到输入#为止:**使用死循环while(1),后满足一定条件便跳出循环(break语句)的方法。此题的条件显然是if(str[i][0]==’#’)。
**②如何对字符串进行排序:**对于初学者来说,首先学习的排序是“冒泡排序”,那如何对字符串进行基于长度的“冒泡排序”呢?这里,我们需要使用strlen函数和strcpy函数:(这两个函数均在头文件<string.h>中)
(1)strlen函数:统计字符串的长度。统计空格,不统计末位’\0’。
(2)strcpy函数:即复制函数。strcpy(a,b)的作用可以简单理解为将b中的字符串复制到a中(注意:b字符串的末位’\0’也会被复制,也就是说a完全变成了b)。
由于是对字符数组的复制,函数需要传递指针,则括号内只需要写数组名(首元素地址)就可以了。

**以前我们学过数字大小的冒泡排序,其中交换两数的部分通过temp暂存变量配合来实现。现在对字符串进行交换也是如此。
(temp是另外创建的一维字符数组)

if (strlen(str[k-1])>strlen(str[k]))
{
strcpy(temp,str[k]);
strcpy(str[k],str[k-1]);
strcpy(str[k-1],temp);
}

解决了上述问题,我们就可以写程序了:

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

int main(void)
{
  char str[20][11];
  int i=0;
  
  while (1)
  {
      scanf("%s",str[i]);
      if (str[i][0]=='#')
        break;
      i++;                //i同时也记录了有几个单词
  }

  int len=i;       //用len记录i,增加程序的可读性
  int j,k;
  char temp[11];
  
  for (j=0; j<=len-1; j++)     //对字符串进行冒泡排序
  {
    for (k=0; k<len-j; k++)
    {
        if (strlen(str[k-1])>strlen(str[k]))
        {
            strcpy(temp,str[k]);
            strcpy(str[k],str[k-1]);
            strcpy(str[k-1],temp);
        }
    }
  }

  for (j=0; j<=len-1; j++)
  {
      printf("%s ",str[j]);
  }
  return 0;
}

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐