用C语言按字母顺序排列字符串

用C语言按字母顺序排列字符串,c,arrays,string,sorting,alphabetical-sort,C,Arrays,String,Sorting,Alphabetical Sort,我制作了一个程序,如果用户选择选项2,它会要求用户输入一个名称,并将该名称存储在字符串中,如果用户选择选项3,它会显示该名称。现在对于选项4,它需要按字母顺序排列名称,因此当我再次选择选项3查看名称时,它将按字母顺序显示名称。我的朋友告诉我使用strcpy(),我尝试过,但没有太成功 这是我的代码: //This is my code: #include<stdio.h> #include<string.h> int main() { int i = 0;

我制作了一个程序,如果用户选择选项2,它会要求用户输入一个名称,并将该名称存储在字符串中,如果用户选择选项3,它会显示该名称。现在对于选项4,它需要按字母顺序排列名称,因此当我再次选择选项3查看名称时,它将按字母顺序显示名称。我的朋友告诉我使用strcpy(),我尝试过,但没有太成功

这是我的代码:

//This is my code:

#include<stdio.h>
#include<string.h>

int main() {

    int i = 0;
    int j = 0;

    while (1) {
        int num;
        char name[500][100],t[100];
        printf("\nPress 1 to see author info\n");
        printf("Press 2 to enter a name\n");
        printf("Press 3 to view names\n");
        printf("Press 4 to alphabatize names\n");
        scanf("%d", &num);
        char arr[100];


        if (num == 1)
            {
                printf("----------------\n");
                printf("name\n");
                printf("132\n");
                printf("----------------\n");
            }   


        if (num == 2)
            {
                printf("Enter the name (no spaces)\n");
                scanf("%s", arr);
                strcpy(name[i], arr);
                i++;
            }
        if (num == 3)
            {
                printf("\n******************************");

                for (int j = 0; j<i; j++)
                    {
                        printf("\n%s\n", &name[j]);
                    }
                printf("\n\n\n******************************");
            }


        if (num == 4)
            {

                for (i = 1; i < j; i++) {
                    for (j = 1; j < i; j++) {
                        if (strcmp(name[j - 1], name[j]) > 0) {
                            strcpy(t, name[j - 1]);
                            strcpy(name[j - 1], name[j]);
                            strcpy(name[j], t);
                        }
                    }
                }

                ;
            }

        return(0)
            system("pause");
    }
//这是我的代码:
#包括
#包括
int main(){
int i=0;
int j=0;
而(1){
int-num;
字符名[500][100],t[100];
printf(“\n按1查看作者信息”\n”);
printf(“按2键输入名称\n”);
printf(“按3查看名称”);
printf(“按4将名称字母化\n”);
scanf(“%d”和&num);
char-arr[100];
如果(num==1)
{
printf(“-----------------------\n”);
printf(“名称”);
printf(“132\n”);
printf(“-----------------------\n”);
}   
如果(num==2)
{
printf(“输入名称(无空格)\n”);
scanf(“%s”,arr);
strcpy(名称[i],arr);
i++;
}
如果(num==3)
{
printf(“\n*******************************”);
对于(int j=0;j 0){
strcpy(t,名称[j-1]);
strcpy(名称[j-1],名称[j]);
strcpy(名称[j],t);
}
}
}
;
}
返回(0)
系统(“暂停”);
}

如果Barmar不想让评论成为答案:

如前所述:您在外循环中使用的
i
是总数,您不能使用它,您需要一个新的,比如
k
。按字母顺序排序给出:

int k;
if (num == 4) {
  for (j = 0; j < i; j++) {
    for (k = 0; k < i - j - 1; k++) {
      if (strcmp(name[k], name[k + 1]) > 0) {
        strcpy(t, name[k]);
        strcpy(name[k], name[k+1]);
        strcpy(name[k+1], t);
      }
    }
  }
}
intk;
如果(num==4){
对于(j=0;j0){
strcpy(t,名称[k]);
strcpy(名称[k],名称[k+1]);
strcpy(名称[k+1],t);
}
}
}
}
我对冒泡排序使用了一种稍微不同的方法,这就是我学习它的方式,希望你能理解它


注意:复制完整字符串不是最好的方法,但我不知道您是否已经了解了指针。

如果Barmar不想将注释作为答案:

如前所述:您在外循环中使用的
i
是总数,您不能使用它,您需要一个新的,比如
k
。按字母顺序排序给出:

int k;
if (num == 4) {
  for (j = 0; j < i; j++) {
    for (k = 0; k < i - j - 1; k++) {
      if (strcmp(name[k], name[k + 1]) > 0) {
        strcpy(t, name[k]);
        strcpy(name[k], name[k+1]);
        strcpy(name[k+1], t);
      }
    }
  }
}
intk;
如果(num==4){
对于(j=0;j0){
strcpy(t,名称[k]);
strcpy(名称[k],名称[k+1]);
strcpy(名称[k+1],t);
}
}
}
}
我对冒泡排序使用了一种稍微不同的方法,这就是我学习它的方式,希望你能理解它


注意:复制完整字符串不是最好的方法,但我不知道您是否已经了解了指针。

修改了代码。在这种情况下,开关盒看起来会更漂亮,循环也不会结束。按照@Barmar所说的,您的循环有一个
返回0会提前终止。我已经改变了你的代码的一些元素,因为其中一些适合不受干扰等等

变化表 除了开关柜的实现之外
  • 字符数组的名称和位置。对于t[100],因为它是一个临时对象/变量,所以我将它移动到
    案例(4)
    (参考第63行) 在修改后的代码中),以便根据需要进行创建 早期创建的原始代码的。将t重命名为temp。 至于arr,我已经重命名了它,以便它更清晰(nameIn表示 名称输入)

  • num的名称。为了便于理解代码,我将其设置为namecont,以指示名称的数量或大小。

  • 重新构造循环,使其计数器不会以任何方式修改名称计数,仅将其用作比较的平均值。

  • 增加了循环终止的退出条件,-1以及提供无效输入时的默认情况。(不检查 字母输入法)
  • 修改代码
    #包括
    #包括
    #包括
    int main()
    {
    int namecont=0,num=0;
    while(num!=-1)
    {
    char-nameIn[100];
    字符名[100][100];
    printf(“\n按1查看作者信息”\n”);
    printf(“按2键输入名称\n”);
    printf(“按3查看名称”);
    printf(“按4将名称字母化\n”);
    scanf(“%d”和&num);
    开关(num)
    {
    案例(1):
    {
    printf(“-----------------------\n”);
    printf(“名称”);
    printf(“132\n”);
    printf(“-----------------------\n”);
    打破
    }
    案例(2):
    {
    printf(“输入名称(无空格)\n”);
    scanf(“%s”,nameIn);
    strcpy(名称[名称计数],名称输入);
    nameCount++;
    打破
    }
    案例(3):
    {
    printf(“\n*******************************”);
    对于(int ctr=0;ctr 0)
    {
    字符温度[100]=“”;
    strcpy(临时,名称[ctrLv1]);
    strcpy(名称[ctrLv1],名称[ctrLv2]);
    strcpy(名称[ctrLv2],温度);
    }
    }
    }
    打破
    }
    情况(-1):
    {
    printf(“\nExit