使用冒泡排序算法排序字符串

此代码存储整数变量中的单词数,然后多维数字符串中的单词使用函数按字母顺序对单词进行排序。 我遇到的问题是在函数调用中。

#include #include void sort(char*[50],int); int main () { int i,n=0; char s[50][10]; scanf("%d",&n);//scaning the number of words for(i=0;i<=n;i++)//scaning the words gets(s[i]); sort(s,n); for(i=0;i<=n;i++)//printing the words sorted printf("%s\n",s[i]); } void sort(char*s[50],int n) { int i,j,cmp; char tmp[1][10]; //bubble sorting of words for(i=0; i<n; i++) for(j=0; j0) { strcpy(tmp[0],s[j+1]); strcpy(s[j+1],s[j]); strcpy(s[j],tmp[0]); } } } 

打开你的警告。 char s[50][50]不能转换为char*

试试这个:

 void sort(char(*)[50],int); 

这告诉编译器传入指向至少一个50个字符的缓冲区的指针。 这是多维数组在传递给函数时衰减的内容。

并且为了进一步摆脱“ char[]char*相同的愚蠢概念”,由于某种原因仍然在各地教授,请阅读: http : //c-faq.com/aryptr/aryptr2.html

你很亲密 这是您的代码的工作版本。 请注意, scanf()从… fgets()的数字中留下换行符,因为你不会再使用gets() ,是吗? …所以你需要在scanf()之后读取并包括换行符。 当然,有一个有趣的问题是“为什么人们认为人类计算比计算机数更好呢?” 如果不打扰计数会更明智。 请注意,修订后的代码validationn以确保它不大于50。

修改后的代码适用于长度为9或更短的行

 #include  #include  #include  void sort(char s[50][10], int); int main(void) { int i; int n = 0; char s[50][10]; char line[11]; if (scanf("%d", &n) != 1) { fprintf(stderr, "Failed to read a number\n"); return 1; } if (n <= 0 || n > 50) { fprintf(stderr, "%d is out of the range 1..50\n", n); return 1; } // Gobble rest of first line while ((i = getchar()) != EOF && i != '\n') ; for (i = 0; i < n; i++) { if (fgets(line, sizeof(line), stdin) == 0) break; // Remove newline from input size_t len = strlen(line); assert(len > 0 && len <= sizeof(s[i])); line[len-1] = '\0'; strcpy(s[i], line); } n = i; // In case the file was shorter than stated! printf("Before:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); sort(s, n); printf("After:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); return 0; } void sort(char s[50][10], int n) { int i, j, cmp; char tmp[10]; if (n <= 1) return; // Already sorted for (i = 0; i < n; i++) { for (j = 0; j < n-1; j++) { cmp = strcmp(s[j], s[j+1]); if (cmp > 0) { strcpy(tmp, s[j+1]); strcpy(s[j+1], s[j]); strcpy(s[j], tmp); } } } } 

此代码将行读入一个字符串,其长度足以容纳9个数据字符,换行符和终止为null。 它删除换行符,最多留下9个数据字符,终止为null。

样品运行:

 Before: Number 34 Number 39 Number 32 Number 30 Number 22 Number 34 Number 57 Number 28 Number 30 Number 47 Number 43 Number 23 Number 22 After: Number 22 Number 22 Number 23 Number 28 Number 30 Number 30 Number 32 Number 34 Number 34 Number 39 Number 43 Number 47 Number 57 

适用于长度为8或更短的行的原始代码

 #include  #include  #include  void sort(char s[50][10], int); int main(void) { int i; int n = 0; char s[50][10]; if (scanf("%d", &n) != 1) { fprintf(stderr, "Failed to read a number\n"); return 1; } if (n <= 0 || n > 50) { fprintf(stderr, "%d is out of the range 1..50\n", n); return 1; } // Gobble rest of first line while ((i = getchar()) != EOF && i != '\n') ; for (i = 0; i < n; i++) { if (fgets(s[i], sizeof(s[i]), stdin) == 0) break; // Remove newline from input size_t len = strlen(s[i]); assert(len > 0); s[i][len-1] = '\0'; } n = i; // In case the file was shorter than stated! printf("Before:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); sort(s, n); printf("After:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); return 0; } void sort(char s[50][10], int n) { int i, j, cmp; char tmp[10]; if (n <= 1) return; // Already sorted for (i = 0; i < n; i++) { for (j = 0; j < n-1; j++) { cmp = strcmp(s[j], s[j+1]); if (cmp > 0) { strcpy(tmp, s[j+1]); strcpy(s[j+1], s[j]); strcpy(s[j], tmp); } } } } 

“大”变化是声明和定义函数数组参数的方式。 您传递的是50行的数组,每行10个字符,因此只需在函数中指定。 您可以从函数参数的维度中删除50,而不会更改程序的行为。

样本输入:

 8 fed abc cba def hij cba xyz aaa 

示例运行:

 $ ./srt < data Before: fed abc cba def hij cba xyz aaa After: aaa abc cba cba def fed hij xyz $ 

需要修改的事实表明了测试限制的重要性(并仔细定义了限制)。

修订后的代码仍然不是通用代码。 最多50行输入的固定限制,作为输入的一部分所需的行数的计数,以及每行最多10个字符的固定行长度都使其成为玩具代码。 因此,GIGO(垃圾进,垃圾出)不是不合理的反应。 如果数据文件包含超长行,则可以获得所需内容。 代码不会崩溃,但输出可能没有多大意义。

更改

 void sort(char*[50],int); ... void sort(char*s[50],int n) 

 void sort(char(*)[10],int);//not char(*)[50] ... void sort(char(*s)[10],int n) 

 //remain newline scanf("%d",&n); 

 scanf("%d%*c",&n);//read and drop newline 

所以改变

 for(i=0;i<=n;i++) 

 for(i=0;i 

要么

 char *p[50]; for(i=0;i