我需要按字母顺序相应地排列名称。我设法获得了所需的输出。但是,当我用第一个大写字母键入名称时,例如: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]
未初始化的数组具有未定义的行为。 - 你只更新
first
或last
,但不是两者。如果只有一个字,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/