C 使用气泡排序算法对字符串进行排序
该代码将单词数存储在整数变量中,并将单词存储在多维字符串中,然后使用函数按字母顺序对单词进行排序。我遇到的问题是函数调用C 使用气泡排序算法对字符串进行排序,c,C,该代码将单词数存储在整数变量中,并将单词存储在多维字符串中,然后使用函数按字母顺序对单词进行排序。我遇到的问题是函数调用 #include<stdio.h> #include<string.h> 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=
#include<stdio.h>
#include<string.h>
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; j<n-1; j++)
{
cmp=strcmp(s[j],s[j+1]);
if(cmp>0)
{
strcpy(tmp[0],s[j+1]);
strcpy(s[j+1],s[j]);
strcpy(s[j],tmp[0]);
}
}
}
#包括
#包括
无效排序(字符*[50],整数);
int main()
{
int i,n=0;
chars[50][10];
scanf(“%d”,&n);//扫描字数
对于(i=0;i打开警告。chars[50][50]
不能转换为char*
试试这个:
void sort(char(*)[50],int);
这会告诉编译器您传入一个指针,指向至少一个50个字符的缓冲区。
这就是多维数组在传递到函数时的衰减
为了进一步摆脱那种愚蠢的观念,即“char[]
与char*
”是一样的,出于某种原因,这种观念仍然在各地教授,请阅读以下内容:打开警告。char[50][50]
不能转换为char*
试试这个:
void sort(char(*)[50],int);
这会告诉编译器您传入一个指针,指向至少一个50个字符的缓冲区。
这就是多维数组在传递到函数时的衰减
为了进一步摆脱“char[]
与char*
相同”的愚蠢观念,出于某种原因,这一观念仍然在各处教授,请阅读以下内容:你很接近了。这是你的代码的一个工作版本。请注意,scanf()
将换行符从…fgets()的数字中删除
,因为您永远不会再使用get()
,是吗?…所以您需要读取并包括scanf()后面的换行符
。当然,有一个有趣的问题是“为什么人们认为人类计数比让计算机计数更好?”更明智的做法是不用担心计数。请注意,修改后的代码验证n
,以确保它不大于50
修订代码,适用于长度为9或更短的行
在长度为8或更短的行上工作的原始代码
运行示例:
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
$ ./srt < data
Before:
fed
abc
cba
def
hij
cba
xyz
aaa
After:
aaa
abc
cba
cba
def
fed
hij
xyz
$
$。/srt
这一需要修改的事实表明了测试极限(并仔细定义极限)的重要性
修订后的代码仍然不是通用代码。最多50行输入的固定限制、作为输入一部分所需的行数计数以及每行最多10个字符的固定行长度都使其成为玩具代码。因此,GIGO(垃圾输入,垃圾输出)这不是一个不合理的反应。如果数据文件包含过长的行,您将得到您所得到的。代码不会崩溃,但输出可能没有多大意义。您很接近。这是您的代码的一个工作版本。请注意,
scanf()
从编号中为…fgets()留下新行
,因为您永远不会再使用get()
,是吗?…所以您需要读取并包括scanf()后面的换行符
。当然,有一个有趣的问题是“为什么人们认为人类计数比让计算机计数更好?”更明智的做法是不用担心计数。请注意,修改后的代码验证n
,以确保它不大于50
修订代码,适用于长度为9或更短的行
在长度为8或更短的行上工作的原始代码
运行示例:
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
$ ./srt < data
Before:
fed
abc
cba
def
hij
cba
xyz
aaa
After:
aaa
abc
cba
cba
def
fed
hij
xyz
$
$。/srt
这一需要修改的事实表明了测试极限(并仔细定义极限)的重要性
修订后的代码仍然不是通用代码。最多50行输入的固定限制、作为输入一部分所需的行数计数以及每行最多10个字符的固定行长度都使其成为玩具代码。因此,GIGO(垃圾输入,垃圾输出)这不是一个不合理的反应。如果数据文件包含过长的行,您将得到您得到的。代码不会崩溃,但输出可能没有多大意义。更改
void sort(char*[50],int);
...
void sort(char*s[50],int n)
到
及
到
所以改变
for(i=0;i<=n;i++)
用于(i=0;i变化
到
及
到
所以改变
for(i=0;i<=n;i++)
用于(i=0;iI更改了代码,但仍然不起作用。感谢您回答我的问题。@JohnnyCash,如何更改?请用这些更改更新您的问题。我更改了函数的声明。@JohnnyCash,我可以。但我的老板希望我做类似的事情,他正在付钱。我将建议您学习如何使用调试器。步骤th粗略地编写代码并进行修复。这将使您成为一名比要求他人为您更正代码要好得多的开发人员。感谢您帮助我更正代码。现在,我在函数调用中仍然存在一个问题。您能告诉我函数调用中有什么错误吗?我更改了代码,但仍然不起作用。谢谢您回答我的问题问题。@JohnnyCash,如何更改?请用更改更新您的问题。我更改了函数的声明。@JohnnyCash,我可以。但我的老板希望我做类似的事情,他正在付钱。我建议您学习如何使用调试器。逐步完成代码并修复它。这将使您成为一名比询问其他人更好的开发人员rs为您更正代码。感谢您帮助我更正代码。现在,我在函数调用中仍然有一个问题。您能告诉我函数调用中有什么错误吗?此修订后的代码无法干净编译;sort()的声明
采用了不同于排序定义的类型。使用大小为10的临时数组复制大小为50的字符串似乎也会带来麻烦。Jonathan说的话。另外,初始化n
,这样不会使缓冲区溢出。另外,不要使用get()
!永远不要使用get()
。假装它中止了您的程序。
scanf("%d%*c",&n);//read and drop newline
for(i=0;i<=n;i++)
for(i=0;i<n;i++)
char *p[50];
for(i=0;i<n;++i)
p[i]=&s[i][0];
sort(p,n);//OK only exchange of pointer in this case