c - 在 C 中对具有交替位置的单词和数字的字符串进行排序

标签 c string sorting selection-sort

例如-如果我的字符串是-“Friend 32 Hello 12” 我的输出应该是 - “你好 12 friend 32”

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

int main(void) {
    char a[100][100],temp[100];
    int i,j,c;
    for(i=0;i<100;i++) 
    {
    scanf("%s",a[i]);
    if(i%2==0)
    {
        for(j=0;j<100;j++)
        {
            if(isupper(a[i][j]))
           a[i][j]=a[i][j]+32;
        }
    }
    }
    for(i=0;i<100;i++)
    {
        printf("%s",a[i]);
        printf("\n");
    }
    for(i=0;i<99;i=i+2)
    {
        for(j=i+2;j<100;j=j+2)
        {
           c=strcmp(a[i],a[j]);
           if(c>0)
           {
           *temp=*a[i];
           *a[i]=*a[j];
           *a[j]=*temp;

         }
        }

    }
    for(i=0;i<100;i=i+2) 
    {
        printf("%s",a[i]);
    }

    return 0;
}

我不明白我的代码哪里错了。它正在打印一些垃圾值。 我正在使用选择排序算法。

最佳答案

你想根据数字对 50 对字符串和数字进行排序。为此,您定义了一个包含 100 个字符串的数组。我建议您将数据表示为两个包含 50 个整数和 50 个字符串的数组。 (这只是第一个想法,请参阅下文以获得更好的建议。)

C 中的字符串实际上是末尾有空字节的字符数组。您不能将数组相互分配,但可以复制它们的内容。如果你想交换字符串,你必须复制实际的字符。函数strcpy来自<string.h>为你而死。

对数组进行排序时,您仅对一个数组进行比较,但同时交换两个数组。数字交换是直接的,字符串交换需要深度复制 strcpy .

这是初稿:

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

#define N 50
#define MAXLEN 40

int main(void)
{
    char str[N][MAXLEN];
    int num[N];
    int i, j;

    for (i = 0; i < N; i++) {
        if (scanf("%s%d", str[i], &num[i]) != 2) {
            fprintf(stderr, "Wrong input format!");
            exit(1);
        }

        for (j = 0; str[i][j] != '\0'; j++) {
            str[i][j] = tolower(str[i][j]);
        }
    }

    for (i = 0; i < N; i++) {
        printf("%s %d\n", str[i], num[i]);
    }

    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++) {
            if (num[i] > num[j]) {
                int tnum;
                char tstr[MAXLEN];

                tnum = num[i];
                num[i] = num[j]; 
                num[j] = tnum;

                strcpy(tstr, str[i]);
                strcpy(str[i], str[j]);
                strcpy(str[j], tstr);
            }
        }
    }

    puts("--");
    for (i = 0; i < N; i++) {
        printf("%s %d\n", str[i], num[i]);
    }

    return 0;
}

当您必须将事物放在一起时,通常的方法是将它们打包到一个结构中。然后,您可以移动整个结构,而不必担心字符串和数字不同步。

结构体之间可以互相赋值;然后复制它们的内容。这使得交换更容易。另一个优点是结构体可以使用标准排序例程 qsort 进行排序。来自<stdlib.h> .

所以让我们这样做:

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

#define N 50
#define MAXLEN 40

struct pair_t {
    char str[MAXLEN];
    int num;    
};

int main(void)
{
    struct pair_t pair[N]; 
    int i, j;

    for (i = 0; i < N; i++) {
        if (scanf("%s%d", pair[i].str, &pair[i].num) != 2) {
            fprintf(stderr, "Wrong input format!");
            exit(1);
        }

        for (j = 0; pair[i].str[j] != '\0'; j++) {
            pair[i].str[j] = tolower(pair[i].str[j]);
        }
    }

    for (i = 0; i < N; i++) {
        printf("%s %d\n", pair[i].str, pair[i].num);
    }

    for (i = 0; i < N; i++) {
        for (j = i + 1; j < N; j++) {
            if (pair[i].num > pair[j].num) {
                struct pair_t tmp;

                tmp = pair[i];
                pair[i] = pair[j]; 
                pair[j] = tmp;
            }
        }
    }

    puts("--");
    for (i = 0; i < N; i++) {
        printf("%s %d\n", pair[i].str, pair[i].num);
    }

    return 0;
}

最后 - 但这是一个更高级的主题 - 如果您的结构很长,您最终会交换大量字节,这不是很有效。您可以创建一个指向您的对的指针数组,然后对指针进行排序并保留原始数组。

关于c - 在 C 中对具有交替位置的单词和数字的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242143/

相关文章:

使用 malloc 和 realloc 将静态数组更改为动态数组?

c - 如何正确检查空字符

在 linux 内核中请求相对较大的大小时,无法从 `flex_array_alloc` 分配内存

mysql搜索字符串类似于php中的in_array

c++ - 如何在C++中将字符串转换为json格式?

Python:将一个列表除以另一个列表的长度,并用该除法创建一个字典

objective-c - getchar() 不按 'enter' 按钮

java - Java中如何以不区分大小写的方式检查一个字符串是否包含另一个字符串?

C++ 排序的对象集

c++ - Eigen - 排序矩阵对角线