Bootstrap

C语言 以字符串的长度为衡量标准进行排序

最近遇到了一个比较综合的题目

是这样的,先描述一下题目,首先输入一个数字N,代表着下面将会有N个字符串的输入

注意:N不会超过10,每个字符串的长度不会超过20

我们要编写一个程序,实现以长度为衡量标准对这N个字符串的升序,并输出。

#include <stdio.h>
#include <string.h>
int main()
{
    char  ch[10][21];
    /*对比一维字符串数组,比如说,定义 char x[150] 后面用x来表示整个字符串就可以了
    定义二维字符串数组char[10][50],可以理解成具有10行内容,每一行最多49个,每一行的字符串用char[]表示
    */
    int i,j,iCnt=0; //循环变量i和j,单词个数iCnt 
    while (1)
    {
        scanf("%s" ,ch[iCnt]);
        iCnt++;
        if (strcmp(ch[iCnt-1] ,"#") == 0) 
        {
            //strcmp 如果 前面小于后面返回负数
            break;
        }        
    }
    iCnt--;  //最后输入的#不计算 
    
    //对二维字符数组按照每一行内容进行冒泡排序 
    for(i=0; i<iCnt-1; i++){
        for(j=i+1; j<iCnt; j++)
        if ( strlen(ch[i]) > strlen(ch[j]) )
        {
            char middle[60];
            strcpy(middle,ch[i]);
            strcpy(ch[i] ,ch[j]);
            strcpy(ch[j] ,middle);
            /*strcpy这个函数很有意思
            char s[50]="ascasc";
            char z[50]="lll";
            比如 strcpy(s,z);
            这个时候 s 就变成"lll"了 即使后面还有内容
             */
        }
    }
    //输出排序后的 
    for(i=0; i<iCnt;i++)
     printf("%s "  ,ch[i]);
    return 0;
}


以上就是完整的代码,其中有一些细节很有趣,也值得注意,可以拿出来提一下:

首先是在二维数组定义的时候,在第二个方括号内部我们写的是【21】,因为要考虑到最后的结束符,万一真的输入了20个呢。

第二点就是关于数组其实本质上就是一个指针的应用


scanf("%s" ,ch[iCnt]);
我们在输入字符串的时候应用到了这一点,其实ch【0】就代表了第一个字符串的地址。

同样还有一点:

然后一点就是我对于strcpy这个函数的理解:
strcpy这个函数很有意思
char s[50]="ascasc";
char z[50]="lll";
比如 strcpy(s,z);
这个时候 s 就变成"lll"了 即使后面还有内容
*/

这和我的第一印象是不一样的,在上面的例子中,我的第一直觉以为得到的是lllasc。

带着这样的疑问,我去查找学习了strcpy这个函数的原型


 

char *strcpy(char *strDest, const char *strScr)
{
       char *address=strDest;
       assert((strDest != NULL) && (strScr != NULL));
       while(*strScr)                   //是while(*strScr != ’/0’)的简化形式;
       {
              *strDest++ = *strScr++;
       }
       *strDest = '/0';                       //当strScr字符串长度小于原strDest字符串长度
       return address;                      //时,如果没有改语句,就会出错了。
}
————————————————
版权声明:本文为CSDN博主「nadakiss」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nadakiss/article/details/6259603


这样就很清晰,尤其是倒数第二句的 *strDest='\0' 就说明后面即使存在内容也全部都不会输出了。

但在这里,assert()这个函数从来没有见到过,于是又去了解学习了这个函数:


assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。

原型定义:
#include <assert.h>
void assert( int expression );
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

这个函数可以用来检查传输内容的有效性,从而来保障整个代码的健壮性。
 

;