这几天,我写了一个用数组指针来排序的程序。因为用数组指针可以提高程序执行的时间,因为这可以不必移动原来的 数值内容。而只要用一个数组指针来指向就可以了。 下面是我用gets和scanf来分别做的代码。会发现有很多的不同。
1 的代码如下:
# include <stdio.h>
# include <string.h>
int main()
{
char aa[10][20] ,*p[10],*temp;
int k,j,i=0;
printf("输入要排序的字符串,以回车结束。/n");
do{
gets(aa[i]); //注意,scanf不能获取回车。
p[i] = aa[i] ;
i++;
}while (strlen(aa[i-1]) != 0 && i < 10);
//while (strcmp(aa[i-1]," ") != 0 && i < 10);
printf("i is %d/n",i);
printf("开始排序。/n");
for (j = 0;j < i - 1; j++)
{
for(k = j + 1; k < i - 1; k++)
{
if(strcmp(p[j], p[k]) >= 0)
{
temp = p[k] ;
p[k] = p[j] ;
p[j] = temp ;
}
}
}
for (j = 0;j < i - 1; j++)
printf("%s/n",p[j]);
}
运行结果如下:
[root@localhost apue example]# ./gets.out
输入要排序的字符串,以回车结束。
fajl
fdsa
erafas
fasg
i is 5
开始排序。
erafas
fajl
fasg
fdsa
[root@localhost apue example]#
注意:其中有个空白行,是我用回车。
2 的代码如下:
# include <stdio.h>
# include <string.h>
int main()
{
char aa[10][20] ,*p[10],*temp;
int k,j,i=0;
printf("输入要排序的字符串,以回车结束。/n");
do{
scanf("%s",aa[i]); //注意,scanf不能获取回车。
p[i] = aa[i] ;
i++;
} while (strcmp(aa[i-1],"q") != 0 && i < 10); // while (strlen(aa[i-1]) != 0 && i < 10);
printf("i is %d/n",i);
printf("开始排序。/n");
for (j = 0;j < i - 1; j++)
{
for(k = j + 1; k < i - 1; k++)
{
if(strcmp(p[j], p[k]) >= 0)
{
temp = p[k] ;
p[k] = p[j] ;
p[j] = temp ;
}
}
}
for (j = 0;j < i - 1; j++)
printf("%s/n",p[j]);
}
运行结果如下:
[root@localhost apue example]# ./sorting.out
输入要排序的字符串,以回车结束。
fjas;lg
fas
ewrtfeg
fas
q
i is 5
开始排序。
ewrtfeg
fas
fas
fjas;lg
[root@localhost apue example]#
注意:其中有个空白行,是我用回车。
感想:
1 要用回车做数组的结束符的话,只能用gets 加 strlen的方法。因为从上面可以看出来scanf是不能接收回车和空格的。比如:你用一个scanf 后,你输入回车和空格,或只有回车等,都没有用。
2 对于字符排序有了比较深刻的印象。
3 可以把一个字符串赋值给一个指针值。
1 的代码如下:
# include <stdio.h>
# include <string.h>
int main()
{
char aa[10][20] ,*p[10],*temp;
int k,j,i=0;
printf("输入要排序的字符串,以回车结束。/n");
do{
gets(aa[i]); //注意,scanf不能获取回车。
p[i] = aa[i] ;
i++;
}while (strlen(aa[i-1]) != 0 && i < 10);
//while (strcmp(aa[i-1]," ") != 0 && i < 10);
printf("i is %d/n",i);
printf("开始排序。/n");
for (j = 0;j < i - 1; j++)
{
for(k = j + 1; k < i - 1; k++)
{
if(strcmp(p[j], p[k]) >= 0)
{
temp = p[k] ;
p[k] = p[j] ;
p[j] = temp ;
}
}
}
for (j = 0;j < i - 1; j++)
printf("%s/n",p[j]);
}
运行结果如下:
[root@localhost apue example]# ./gets.out
输入要排序的字符串,以回车结束。
fajl
fdsa
erafas
fasg
i is 5
开始排序。
erafas
fajl
fasg
fdsa
[root@localhost apue example]#
注意:其中有个空白行,是我用回车。
2 的代码如下:
# include <stdio.h>
# include <string.h>
int main()
{
char aa[10][20] ,*p[10],*temp;
int k,j,i=0;
printf("输入要排序的字符串,以回车结束。/n");
do{
scanf("%s",aa[i]); //注意,scanf不能获取回车。
p[i] = aa[i] ;
i++;
} while (strcmp(aa[i-1],"q") != 0 && i < 10); // while (strlen(aa[i-1]) != 0 && i < 10);
printf("i is %d/n",i);
printf("开始排序。/n");
for (j = 0;j < i - 1; j++)
{
for(k = j + 1; k < i - 1; k++)
{
if(strcmp(p[j], p[k]) >= 0)
{
temp = p[k] ;
p[k] = p[j] ;
p[j] = temp ;
}
}
}
for (j = 0;j < i - 1; j++)
printf("%s/n",p[j]);
}
运行结果如下:
[root@localhost apue example]# ./sorting.out
输入要排序的字符串,以回车结束。
fjas;lg
fas
ewrtfeg
fas
q
i is 5
开始排序。
ewrtfeg
fas
fas
fjas;lg
[root@localhost apue example]#
注意:其中有个空白行,是我用回车。
感想:
1 要用回车做数组的结束符的话,只能用gets 加 strlen的方法。因为从上面可以看出来scanf是不能接收回车和空格的。比如:你用一个scanf 后,你输入回车和空格,或只有回车等,都没有用。
2 对于字符排序有了比较深刻的印象。
3 可以把一个字符串赋值给一个指针值。