字符串 - 以大写字母的字母顺序排列的名字和姓氏

时间:2017-09-19 16:22:57

标签: c string algorithm function pointers

我需要按字母顺序排列名称。我设法得到了所需的输出。但是,当我输入带有第一个上限的名称时,例如:Peter,输出是不同的。

EG输入:Peter Paul John Mary

EG输出:First word = John, Last word = 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]);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您的方法存在一些问题:

  • 您不初始化first,也不初始化last:将word[i]与未初始化的数组进行比较时,行为未定义。
  • 您只能更新firstlast,但不能同时更新两者。如果只有一个字词,first last应该只收到一个字。
  • strcmp()区分大小写。如果要以不区分大小写的方式确定名和姓,则必须编写更多代码。使用来自tolower()的{​​{1}}可以实现一种简单的方法,但完整的解决方案需要深入理解名称整理规则,这非常复杂并且特定于语言环境。

这是一种简单的方法:

<ctype.h>

答案 1 :(得分:0)

strcmp区分大小写,因此“彼得”和“彼得”被认为是不同的。相反,您希望使用strcasecmp,因为这会忽略字符的情况。

答案 2 :(得分:0)

从提供的代码中,不清楚如何声明和初始化与参数firstlast对应的参数。

但无论如何,该功能不应该做到应对。

它可以看作以下方式

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

#define N   40

void findMinMaxStr( char word[][N], size_t size, char **first, char **last ) 
{
    *first = *last = word[0];

    for ( size_t i = 0; i < size; i++ ) 
    {
        if ( strcmp( word[i], *first ) < 0 )
        {
            *first = word[i];
        }
        else if ( strcmp( *last, word[i] ) < 0 )
        {
            *last = word[i];
        }
    }
}

int main(void) 
{
    char word[][N] = { "Peter",  "Paul",  "John", "Mary" };
    char *first, *last;

    findMinMaxStr( word, sizeof( word ) / sizeof( *word ), &first, &last );

    printf( "First = \"%s\", last = \"%s\"\n", first, last );

    return 0;
}

程序输出

First = "John", last = "Peter"

答案 3 :(得分:0)

firstlast初始化为word[0]以及功能的开头,如下所示:

strcpy(first, word[0]);
strcpy(last, word[0]);

然后输入Peter Paul john Mary,你会得到:

  

第一个字=玛丽,最后一个字=约翰

这是正确的,因为大写字母在词典上大于较低的字母。

对于Peter Paul John Mary的输入,您应该得到:

  

第一个词=约翰,最后一个词=彼得

这也是正确的。