各位C语言的高手们,小弟今个遇到一道:将若干字符串按字母顺序(由小到大)输出,问题在下面

#include<stdio.h>
#include(string.h>
int main()
{
void sort(char * name[],int n);
void printf(char *name[],int n);
char * name[]={"Follow me","BASIC",Great Wall","FORTRAN","Computer design"};
int n=5;
sort(name,n);
printf(name,n);
system("pause");
returen 0;
}
void sort(char * name[],int n)
{
int i,j,k;
char * temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strcmp(name[k],name[j])>0) k=j; /*求各位大侠解释一下这句话的含义啊?name[k]和[j]明明是两个字符串的首地址,为什么可以直接拿来作比较呢*/
}
if (k!=i)
{temp=name[i];name[i]=name[k];name[k]=temp;}
}
}
void printf(char * name[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",name[i]);
return 0;
}

这个编译应该是对的啊,首先说一下那个字符串数组char * name[]吧,它是一个数组,里面存放的是字符串的首地址,sort(name,n);传递的仍然是数组,只不过数组里存的是指向字符串首地址的指针而已。再说一下你的那个疑问,strcmp(name[k],name[j]),strcmp的参数就是指向字符串的指针啊,比较过程是这样的,先比较每个指针指向的第一个字符,如果不相同则结束比较,如果相同,则都指向下一个字符再比较,知道出现不同字符或遇到结束符时结束,所以你这个函数,通过传递数组里字符串的首地址来比较,进而排序。
不知听懂没有,有问题再追问追问

这位大侠小弟想问一下 {temp=name[i];name[i]=name[k];name[k]=temp;}这里交换的是什么变量啊?

追答

交换的是指向字符串的指针,因为数组的成员就是指针,要想交换字符串输出,只需要交换指向字符串的指针就行了。
printf("%s\n",name[i]);从这里你就可以看出name[i]是一个指针,输出的是%s。

追问

这位大侠为什么我在printf("%s\n",*name[i]);里面加了个 *就错了呢?

追答

肯定错了啊,name[i]是一个指向字符串的指针,printf("%s\n",name[i]);就相当于你以前见到的printf("%s\n",p);因为现在输出的是字符串,所以p一定要是指针。
而*name[i]是字符串的首字母,不能用%s输出,而应该用%c输出,你换成printf("%c\n",*name[i]);就不会报错了。
但你这个程序是要输出排序后的字符串,所以输出的应该是printf("%c\n",name[i]);

追问

为什么说*name[i]是字符串的第1个字母啊?

追答

在原数组里,name[0]就是指向字符串"Follow me"的指针,*name[0]就相当于取出指针所指向的值,这里指向的就是第一个字符'F',*(name[0]+1)就是‘o’。你一定要清楚name[ ]数组里存放的是指针

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-09
*name[]是指针数组,数组内的每个元素都是一个指针,指针指向字符串,因此在字符串比较函数中,可以这样引用。
第2个回答  2012-08-03
说明 你的程序有问题。应该是 *name[k].
第3个回答  2012-11-01
strcmp函数
函数原型 int strcmp (char *str1,char *str2) <参见书本后的C库函数>
因此str1,str2其实是指针变量(字符串的首地址)。注意区别strcmp ( “str1”,“str2”)和strcmp (str1,str2)的不同。前者是字符串的值为str1,str2。后者是字符串的地址为str1,str2。
因此if(strcmp(name[k],name[j])>0) k=j; /*使用指针(地址)*/ 是符合strcmp函数原型的。
不过可以这样使用strcmp ( “China”,“Korea”)。strcmp函数的实参是具体的字符串,而不必是指向字符串的指针。应该是C编译器做了处理,可以识别实参是具体的字符串的情况,进行了指针转换。

各位C语言的高手们,小弟今个遇到一道:将若干字符串按字母顺序(由小到大...
int strcmp(const char *, const char *)name是char *的数组,所以每个name[i]都是char

C语言:编写程序,把字符数组中的字母按由小到大 的顺序排列并输出
}int main() { char s[] = "kjferu21398dyfkaqpoia"; qsort(s, strlen(s), 1, cmp); printf("%s", s); return 0;}

c语言中从键盘输入N个字符串,将字符串按从小到大的顺序排列并输出
代码如下:define N 10 int main(){char str[N][100]; int i,j; for(i = 0; i < N; i ++) scanf("%s",str[i]); for(i = 0; i < N-1; i ++) { for(j = i+1; j < N; j ++){ if(strcmp(str[i],str[j])>0) { char temp[100]; strcpy(temp,str[i]);...

C语言(1)输入1个字符串,对该字符串按字符大小从小到大的顺序排序,然后...
int main( ){char s[100],*p,*p1,*p2,c;gets(s); \/\/读取字符串 for(p=s;*p;p++); \/\/求得串长,p指向'\\0'p--; \/\/冒泡排序外循环终点 for(p1=s;p1<p;p1++,p--) \/\/此二重循环为冒泡排序 for(p2=s;p2*(p2+1)){c=*p2;*p2=*(p2+1);*(p2+1)=c;} p...

C语言 从键盘输入n个字符串,从大到小排序输出
include<string.h> int main(){int i,j,n;char s[100][20],t[20];scanf("%d",&n);for(i=0;i<n;i++)scanf("%s",s[i]);printf("=== After sort ===\\n");for(i=0;i<n-1;i++)for(j=0;j<n-1-i;j++)if(strcmp(s[j],s[j+1])>0){strcpy(t,s[j]);strcpy...

C语言:给定一英文字母字符串,先用大写输出一遍,再用小写输出一遍,最后...
这个题目可以写一个输出大写字母的函数,和一个输出小写字母的函数,对不符合大小写的字母进行更改,其余的字符不改变。输出原串的话,直接输出就可以。

用C语言,输入n个字符串,n由键盘输出,将n个字符串中由小到大输出
define MAX 100 void main(){ char *str[MAX], *tmp;int min;int n, i, j;tmp = (char*)malloc(MAX * sizeof(char));\/*输入字符串*\/ printf ("\\nHow many strings: ");scanf ("%d", &n);getchar ();printf ("input the strings: \\n");for (i = 0; i < n; i++) ...

如何用C语言编程将字符串s中的所有字符按ASCII值从小到大重新排序后输出...
include "string.h"int main(){char s[100],t;int i,j,sum;printf("Input:\\n");gets(s);sum=strlen(s);for(i=0;i<sum-1;i++)for(j=0;j<sum-i-1;j++)if(s[j+1]<=s[j]){t=s[j];s[j]=s[j+1];s[j+1]=t;} printf("Output:\\n");puts(s);return 0;} ...

c语言 输入4个整数\/字符串,按从小到大的顺序输出
include<stdio.h> int main(){ char a[5];int i,j,t;for(i=0;i<4;i++)scanf("%c",&a[i]);for(i=0;i<4;i++)for(j=1;j<4;j++)if(a[j-1]>a[j]){ t=a[j-1];a[j-1]=a[j];a[j]=t;} for(i=0;i<4;i++)printf("%c ",a[i]);return 0;} ...

C语言问题 输入三个字符串,按由小到大的顺序输出
1、修改代码 char temp[100];temp==q1;q1==q2;q2==temp;==换成=,=才是赋值运算符。2、换用其他方法 可以使用三个数组,或者是一个二维数组来存储字符串,同时定义一个指针数组,指向三个字符串的首地址,然后对指针数组进行排序。

相似回答