c - 字符串 - 名字和姓氏按字母顺序排列,大写字母

标签 c string algorithm function pointers

我需要按字母顺序相应地排列名称。我设法获得了所需的输出。但是,当我用第一个大写字母键入名称时,例如:Peter,输出是不同的。

EG 输入:Peter Paul John Mary

EG 输出:第一个词 = John,最后一个词 = d

但是当我用小写字母打字时,输出是完美的。

这是我的代码:

void findMinMaxStr(char word[][40], char *first, char *last, int size);

int main() {
    char word[SIZE][40];
    char first[40], last[40];
    int i, size;

    printf("Enter size: \n");
    scanf("%d", &size);
    printf("Enter %d words: \n", size);
    for (i = 0; i < size; i++)
        scanf("%s", word[i]);

    findMinMaxStr(word, first, last, size);
    printf("First word = %s, Last word = %s\n", first, last);
    return 0;
}

void findMinMaxStr(char word[][40], char *first, char *last, int size) {
    /* Write your program code here */
    int k, l;

    for (k = 0; k < size; k++) {
        if (strcmp(word[k], last) > 0) {
            strcpy(last, word[k]);
        } else
        if (strcmp(word[k], first) < 0) { 
            strcpy(first, word[k]);
        }
    }
}

最佳答案

您的方法存在一些问题:

  • 你没有初始化first , 也不 last :比较word[i]未初始化的数组具有未定义的行为。
  • 你只更新firstlast ,但不是两者。如果只有一个字,first last应该收到唯一的词。
  • strcmp()区分大小写。如果要以不区分大小写的方式确定名字和姓氏,则必须编写更多代码。使用 tolower() 可以实现一种简单的方法来自 <ctype.h>但完整的解决方案需要深入了解名称整理规则,这非常复杂且特定于区域设置。

这是一个简单的方法:

#include <ctype.h>

int strcasecmp(const char *s1, const char *s2) {
    for (;;) {
        unsigned char c1 = tolower((unsigned char)*s1++);
        unsigned char c2 = tolower((unsigned char)*s2++);
        if (c1 != c2) {
            return c1 < c2 ? -1 : 1;
        }
        if (c1 == '\0') {
            return 0;
        }
    }
}           

void findMinMaxStr(char word[][40], char *first, char *last, int size) {
    int k;

    *first = *last = '\0';
    if (size > 0) {
        strcpy(first, word[0]);
        strcpy(last, word[0]);
        for (k = 1; k < size; k++) {
            if (strcasecmp(last, word[k]) < 0) {
                strcpy(last, word[k]);
            } else
            if (strcasecmp(first, word[k]) > 0) { 
                strcpy(first, word[k]);
            }
        }
    }
}

关于c - 字符串 - 名字和姓氏按字母顺序排列,大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46305396/

相关文章:

javascript - AngularJS 将字符串转换为引用 $scope 中对象的对象/数组

c++ - 找到时间 O(n) 和空间 O(1) 的重复有符号整数

c - 为什么 LLVM AddressSanitizer 而不是 GCC 在这里给我内存泄漏?

c - C 中的指针转换

javascript - Javascript 中高效的字符串操作

c++ - 如何获取字符串数组的字符串长度?

java - 如何根据用户的声誉计算帖子的分数?

c# - 计算堆排序对数组进行排序所需的步骤数

c - 使用缓冲区的堆栈损坏

embedded - "volatile"关键字对于嵌入式系统有什么意义?