最近遇到了一个比较综合的题目
是这样的,先描述一下题目,首先输入一个数字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 来终止程序运行。
这个函数可以用来检查传输内容的有效性,从而来保障整个代码的健壮性。