C中的字符串操作?

时间:2014-09-14 14:58:12

标签: c sorting

好的,我正在尝试在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);
}

4 个答案:

答案 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);
}