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