【发布时间】:2022-01-20 10:12:53
【问题描述】:
#include<stdio.h>
void f(char *s[],int n)
{
int i=0;
int j=0;
int x=0;
int k=i;
for (x=0;x<n-1;x++)
{
for(j=0;j<n-1;j++)
{
if(*(*(s+j)+i)>*(*(s+j+1)+i))
{
char *temp;
temp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=temp;
}
else
if(*(*(s+j)+i)==*(*(s+j+1)+i))
{
for(k=1;k<n-1;k++)
{
if(*(*(s+j)+k)>*(*(s+j+1)+k))
{
{
char *temp;
temp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=temp;
break;
}
}
}
}
}
}
}
int main()
{
int n=0;
char * str[100];
char a[100][100];
while(n<=100&&gets(a[n])!=NULL)
{
str[n]=a[n];
n++;
}
f(str,n);
int i=0;
for(i=0;i<n;i++)
{
puts(str[i]);
}
return 0;
}
这就是这段代码的问题:向字符串数组输入多个英文单词,按字母顺序从小到大输出,不能使用strcmp。
样本输入:
一个
两个
三
四个
示例输出:
四
一个
三
两个
我的问题: 这段代码有什么问题
【问题讨论】:
-
代码太糟糕了。
-
输出似乎是正确的(按字母顺序)。
-
请尝试使用更有意义的变量名,以便读者能够理解您的代码。另外,你的意思是按升序排列字符串,因为你问的问题有点不清楚吗?如果是这样,只需使用 strcmp 来获取字符串的顺序并使用任何正常的排序算法
-
人们不喜欢这段代码的主要原因是无意义的重定向和指针运算。不要写像
*(*(s+j)+i)这样不可读的东西,写s[i][j]。也不要使用gets,因为它已经过时了几十年,终于在十年前从 C 语言中删除了。 -
编程不是一个智力难题,你试图让一个程序使用最少或最聪明的字符集工作,让编译器做你想让它做的事情。编程是通信,因此程序必须可读其他人。 (当然,它还必须让编译器执行您希望它执行的操作。)为什么将您的函数命名为
f()而sort()会更清晰?既然s[j]会更清晰,为什么还要写*(s+j)这样的东西?
标签: c sorting c-strings bubble-sort function-definition