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

时间:2016-10-22 00:05:28

标签: 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;
    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");
    }

2 个答案:

答案 0 :(得分: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);
      }
    }
  }
}

我使用了一种略微不同的冒泡方法,这就是我学习它的方法,希望你能理解它。

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

答案 1 :(得分:0)

修改了你的代码。看起来对于这种情况,开关盒会更漂亮,你的循环永远不会结束。有了@Barmar所说的,你的循环有db.collection.aggregate([ { "$match": { "$text": { "$search": "search text" } } }, { "$project": { "_id": 0, "score": { "$meta": "textScore" } } }, { "$orderby": { "score" : -1 } } ]) 因此过早终止。我已经更改了代码的一些元素,因为其中一些元素适合不受干扰等等。

更改列表

除了切换案例的实现

  
      
  1. char数组的名称和位置。对于t [100],由于它是一个临时对象/变量,我将其移动到return 0;(参见第63行)   在修改后的代码中),以便按需创建   早期创建的原始代码。将t重命名为temp。   至于arr,我已将其重命名为更清晰(nameIn表示   名称输入)

  2.   
  3. num的名字为了更容易理解代码,我将其设置为nameCount,以指示名称的数量或大小。

  4.   
  5. 重组循环,以便其计数器不会以任何方式修改nameCount,仅将其用作比较的平均值。

  6.   
  7. 为循环添加退出条件终止,-1以及默认情况下应提供无效输入。 (不检查   字母输入)
  8.   

修改后的代码

case (4)