简体   繁体   English

如何在C中按升序对字符串数组进行排序

[英]How to sort array of strings in ascending order in C

Problem问题

I have made sorting program which is similiar to other found at我制作了与其他类似的排序程序

https://beginnersbook.com/2015/02/c-program-to-sort-set-of-strings-in-alphabetical-order/ https://beginnersbook.com/2015/02/c-program-to-sort-set-of-strings-in-alphabetical-order/

but program which i made is not working.但是我制作的程序不起作用。 I think both are same but my program giving me waste output.我认为两者都是相同的,但我的程序给了我废物输出。

Also i want to know in other program count is set to 5 for example and it should take 6 input starting from 0 but it is getting only 5,How?另外我想知道在其他程序中计数设置为 5,它应该从 0 开始需要 6 个输入,但它只有 5 个,如何?

My Program我的程序

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

int main() {

char str[4][10],temp[10];
int i,j;
printf("Enter strings one by one : \n");
for(i=0;i<5;i++)
    scanf("%s",str[i]);

for(i=0;i<5;i++)
    for(j=i+1;j<5;j++)
        if(strcmp(str[i],str[j])>0){
            strcpy(temp,str[i]);
            strcpy(str[i],str[j]);
            strcpy(str[j],temp);
        }

printf("\nSorted List : ");
for(i=0;i<5;i++)
    printf("\n%s",str[i]);
printf("\n\n");

return 0;

}

Use qsort() .使用qsort()

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

int pstrcmp( const void* a, const void* b )
{
  return strcmp( *(const char**)a, *(const char**)b );
}

int main()
{
  const char* xs[] =
  {
    "Korra",
    "Zhu Li",
    "Asami",
    "Mako",
    "Bolin",
    "Tenzin",
    "Varrick",
  };
  const size_t N = sizeof(xs) / sizeof(xs[0]);

  puts( "(unsorted)" );
  for (int n = 0; n < N; n++)
    puts( xs[ n ] );

  // Do the thing!
  qsort( xs, N, sizeof(xs[0]), pstrcmp );

  puts( "\n(sorted)" );
  for (int n = 0; n < N; n++)
    puts( xs[ n ] );
}

Please don't use bubble sort.请不要使用冒泡排序。 In C, you really do not have to write your own sorting algorithm outside of specialized needs.在 C 语言中,您真的不必在特殊需要之外编写自己的排序算法。

Here is a program which will sort and print your inputted strings.这是一个程序,它将对您输入的字符串进行排序和打印。 Answering a little late, but just in case others have a similar question.回答有点晚,但以防万一其他人有类似的问题。

// This program will sort strings into either ascending or descending order
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE            1000
#define EQUAL               0
#define ASCENDING           0
#define DESCENDING          1

// Function prototypes
void swap_str(char str1[], char str2[]);
void sort_strings(char str[MAX_SIZE][MAX_SIZE], int len, int order_type);
void print_2d_array(char str[MAX_SIZE][MAX_SIZE], int len);

int main(void) {

    int order_type;
    char str[MAX_SIZE][MAX_SIZE];

    // User selecting the order type
    printf("-----------[Order Type]-----------\n");
    printf("Sort your strings in ascending or descending order?\n");
    printf("0 = Ascending | 1 = descending\n");

    scanf("%d", &order_type);
    if (order_type != ASCENDING && order_type != DESCENDING) {
        printf("Please enter 0 or 1\n");
        exit(1);
    }

    // User inputting their strings
    printf("---------[Enter Strings]----------\n");
    printf("Enter Strings one by one.\n");
    printf("Max Strings: %d | Max String Len: %d\n", MAX_SIZE, MAX_SIZE);

    int i = 0;
    while ((i < MAX_SIZE) && (scanf("%s", str[i]) == 1)) i++;
    if (i == MAX_SIZE) printf("You reached the maximum strings allowed\n"); 

    // Program output of the sorted strings    
    printf("---------[Sorted Strings]---------\n");
    sort_strings(str, i, ASCENDING);
    print_2d_array(str, i);

    return 0;
}

// Swaps two strings (assuming memory allocation is already correct)
void swap_str(char str1[], char str2[]) {

    char temp[MAX_SIZE];

    strcpy(temp, str1);
    strcpy(str1, str2);
    strcpy(str2, temp);

}

// Will sort a 2D array in either descending or ascending order,
// depending on the flag you give it
void sort_strings(char str[MAX_SIZE][MAX_SIZE], int len, int order_type) {

    int i = 0;
    while (i < len) {

        int j = 0;
        while (j < len) {

            if ((order_type == ASCENDING) &&
                (strcmp(str[i], str[j]) < EQUAL)) {

                swap_str(str[i], str[j]);
            } else if ((order_type == DESCENDING) &&
                (strcmp(str[i], str[j]) > EQUAL)) {

                swap_str(str[i], str[j]);
            }

            j++;
        }

        i++;
    }

}

// Will print out all the strings 2d array
void print_2d_array(char str[MAX_SIZE][MAX_SIZE], int len) {

    int i = 0;
    while (i < len) {
        printf("%s\n", str[i]);
        i++;
    }
}

Example (Ascending order):示例(升序):

-----------[Order Type]-----------
Sort your strings in ascending or descending order?
0 = Ascending | 1 = descending
0
---------[Enter Strings]----------
Enter Strings one by one.
Max Strings: 1000 | Max String Len: 1000
Mango
Watermelon
Apple
Banana
Orange
// I pressed CTRL+D here (Linux) or CTRL+Z then enter (on Windows). Essentially triggering EOF. If you typed the MAX_SIZE it would automatically stop.
---------[Sorted Strings]---------
Apple
Banana
Mango
Orange
Watermelon

it should take 6 input starting from 0 but it is getting only 5,How?它应该从 0 开始需要 6 个输入,但它只有 5 个,如何?

This loop这个循环

for(i=0;i<5;i++)
    scanf("%s",str[i]);

execute for i being 0, 1, 2, 3, 4 so it loops 5 times.执行i为 0, 1, 2, 3, 4 所以它循环 5 次。

If you want 6 loops do如果你想要 6 个循环

for(i=0;i<=5;i++)
          ^
          Notice

or或者

for(i=0;i<6;i++)
          ^
          Notice

Also notice this line还要注意这一行

char str[6][10],temp[10];
         ^
         Notice

so that you reserve memory for 6 strings这样您就可以为 6 个字符串保留内存

I have this sample that I made:我有我制作的这个样本:

#include <stdio.h>
#include <string.h>
void main()
{
  char str[100],ch;
  int i,j,l;

       printf("\n\nSort a string array in ascending order :\n");
       printf("--------------------------------------------\n");  
       printf("Input the string : ");
       fgets(str, sizeof str, stdin);
  l=strlen(str);
  /* sorting process */
  for(i=1;i<l;i++)
    for(j=0;j<l-i;j++)
    if(str[j]>str[j+1])
    {
      ch=str[j];
      str[j] = str[j+1];
      str[j+1]=ch;
    }
   printf("After sorting the string appears like : \n");
   printf("%s\n\n",str);
  }

This is not an answer, but some criticism of the code you refer to:这不是答案,而是对您所指代码的一些批评:

#include<stdio.h>
#include<string.h>
int main(){
  int i,j,count;
  char str[25][25],temp[25];
  puts("How many strings u are going to enter?: ");
  scanf("%d",&count);                                        // (1)

  puts("Enter Strings one by one: ");
  for(i=0;i<=count;i++)                                      // (2)
    gets(str[i]);
  for(i=0;i<=count;i++)
    for(j=i+1;j<=count;j++){
      if(strcmp(str[i],str[j])>0){
        strcpy(temp,str[i]);
        strcpy(str[i],str[j]);
        strcpy(str[j],temp);
     }
  }
  printf("Order of Sorted Strings:");                        // (3)
  for(i=0;i<=count;i++)
    puts(str[i]);

  return 0;
}

And the criticism:和批评:

(1) scanf("%d",&count); (1) scanf("%d",&count); reads a number into count, and returns after that.将一个数字读入计数,然后返回。 It does not consume the line break(!)它不消耗换行符(!)

(2) this loop does not print anything, just reads. (2) 这个循环不打印任何东西,只是读取。 However if you put但是,如果你把

  for(i=0;i<=count;i++){
    printf("%d:",i);
    gets(str[i]);
  }

in its place, you will suddenly see that it asks for names 0...5, just skips the 0 automatically.取而代之的是,您会突然看到它要求输入名称 0...5,只是自动跳过了 0。 That is where the line break is consumed, it reads an empty string.那就是使用换行符的地方,它读取一个空字符串。 You can also make it appear, if instead of putting 5 into the initial question, you put 5 anmoloo7 .您也可以让它出现,如果不是在最初的问题中输入5 ,而是输入5 anmoloo7

(3) in the printout the names appear below the title Order of Sorted Strings . (3) 在打印输出中,名称出现在标题Order of Sorted Strings下方。 But there is no linebreak in that printf.但是该 printf 中没有换行符。 The thing is that the empty string is "smaller" than any other string, so it gets to the front of the list, and that is printed there first.问题是空字符串比任何其他字符串“小”,所以它到达列表的前面,并且首先打印在那里。 If you do the 'trick' of appending a name after the initial number, the output will look different, there will be 6 names, and one of them appended directly to the title.如果您在初始数字后附加名称的“技巧”,输出看起来会有所不同,将有 6 个名称,其中一个直接附加到标题中。

Plus there is the thing what you probably get from your compiler too: gets is a deadly function, forget its existence and use fgets with stdin as appears in other answers.另外,您也可能从编译器中得到一些东西: gets是一个致命的功能,忘记它的存在并将fgets与 stdin 一起使用,如其他答案中所示。

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

#define STRING_MAX_WIDTH 255

void sort_strings(char str_arr[][STRING_MAX_WIDTH],int len){
    char temp[STRING_MAX_WIDTH];
    for(int i=0;i<len-1;i++){
        if(strcmp(&str_arr[i][0],&str_arr[i+1][0])>0){
            strcpy(temp, str_arr[i+1]);
            strcpy(str_arr[i+1],str_arr[i]);
            strcpy(str_arr[i],temp);
            sort_strings(str_arr, len);
        }
    
    }
}

int main(){
   char str_arr[][STRING_MAX_WIDTH] = {"Test", "Fine", "Verb", "Ven", "Zoo Keeper", "Annie"};
   int len = sizeof(str_arr)/STRING_MAX_WIDTH;
   sort_strings(str_arr, len);
   for(int i=0;i<len;i++){
        printf("%s\r\n", str_arr[i]);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 C 编程:如何对数组进行升序排序 - C programming: How to sort an array in an ascending order 如何在 C 中对数组进行升序排序? - How to sort an array in ascending order in C? 如何在C中使用sort函数按升序对字符串数组进行排序 - how to sort string array in ascending order using sort function in C 如何使用C语言中的数组方法从文本文件中读取数据并对特定列进行升序排序? - How to read data from text file and sort a specific column in ascending order using the array method in C language? 如何使用指针对从文件中读取的数组进行升序排序 - How to sort an array read from a file in ascending order using pointers 如何在不使用数组的情况下按升序对数字进行排序? - How to sort numbers in an ascending order without using an array? C中的动态数组升序排序 - Dynamic array ascending sort in C 无法在C中按升序对链表进行排序 - Unable to sort linked list in ascending order in C C:我编写了一个程序来按升序对数组进行排序,但无法找出 for 循环中某个步骤的原因 - C: I made a program to sort an array in ascending order and cannot figure the reason for a certain step in the for loops C 中数组中大于 n 的元素按升序排序,剩余按降序排序 - sort elements in array that are greater than n in ascending order and remaining in descending in C
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM