好的,我正在尝试在C中询问和排序名称。我完成了代码并且编译时没有错误,但我遇到了问题。当我输入大写和小写的混合字符时,我首先将大写排序,而不是按顺序排序。我该怎么做我的代码?请有人帮助我。
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char name[30][25],temp[25];
int i,j,n;
printf("Enter how many students : ");
scanf("%d",&n);
for(i=0;i<n;i++);
{
printf("Enter the name of the student : ");
scanf("%s",name[i]);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(name[i],name[j])>0)
{
strcpy(temp,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],temp);
}
}
}
printf("The sorted names are : \n");
for(i=0;i<n;i++)
{
printf("%s\n",name[i]);
}
getch();
return(0);
}
答案 0 :(得分:1)
冒泡排序的循环错误 - 更改:
for(i=0;i<n;i++)
{
for(j=i+j;j<n;j++)
{
为:
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
或者只使用标准C库中的qsort而不是尝试重新发明轮子。
答案 1 :(得分:1)
您有两种选择。一,在比较之前将字符串转换为较低(或较高)。其次strcol每个字符串,这将k放在K旁边。两种方法都具有破坏性,因此您可能需要创建一个工作字符串并在比较后释放它。
答案 2 :(得分:0)
首先你的程序是错误的。例如,而不是
scanf("%s",&name[i]);
必须有
scanf("%s", name[i]);
或在本声明中
for(j=i+j;j<n;j++)
使用了未初始化的变量j。
至于你的问题,你应该使用标题toupper
中声明的标准C函数<ctype.h>
将字符串转换为大写
每当name [j]小于name [i]时,最好使用选择排序而不复制字符串。
答案 3 :(得分:0)
多个错误:
不要用分号结束for循环
for(i=0;i<n;i++);
再看看这些变量
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
正如您所描述的那样,您的用例
的比较不正确if(strcmp(name[i],name[j])>0)
这是一个可能的解决方案:
#include <stdio.h>
#include <string.h>
char * Inputs[] =
{
"3\n",
"Carl\n",
"Frank\n",
"carl\n"
};
int in = 0;
int main()
{
char name[30][25],temp[25];
int i,j,n;
printf("Enter how many students : \n");
sscanf(Inputs[in++],"%i",&n);
printf("You entered : %i\n", n);
for(i=0;i<n;i++)
{
printf("Enter the name of the student : \n");
sscanf(Inputs[in++],"%s",&name[i]);
printf("You entered : %s\n", name[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(stricmp(name[i],name[j])>0)
{
strcpy(temp,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],temp);
}
}
}
printf("The sorted names are : \n");
for(i=0;i<n;i++)
{
printf("%s\n",name[i]);
}
getch();
return(0);
}