对预定义的名称列表进行排序

时间:2017-06-09 05:58:38

标签: c strcmp strcpy

我正在为绝对新手第2版C编程中的第8章挑战3工作。该程序应该按字母顺序对一组名称进行排序。

我的程序不起作用。没有sort()的主函数有效,但排序函数搞砸了;基于警告消息,strcmp()似乎也被错误地使用了。

我正在使用的编译器是gcc,我用nano编写了代码。

/* Uses strcmp() in a different function
   to sort a list of names in alphabetical order */

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

void sort(char*, int);

void main() {
    char strStates[4][11] = { "Florida", "Oregon", "California", "Georgia" };
    sort(*strStates, 4); // 4 is the number of string in the array

    printf("\nFour States Listed in Alphabetical Order\n");

    int x;
    for(x = 0; x < 4; x++)
        printf("\n%s", strStates[x]);
}

void sort(char* strNames, int iStrings) {
    char strPlaceholder[11] = { 0 };
    int x;
    int y;

    for(x = 0; x < iStrings; x++) {
        for(y = 0; y < iStrings - 1; y++) {
            if(strcmp(strNames[y], strNames[y + 1]) > 0) {
                strcpy(strPlaceholder, strNames[y + 1]);
                strcpy(strNames[y + 1], strNames[y]);
                strcpy(strNames[y], strPlaceholder);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

不是一个答案,而是一个让你挺身而出的暗示。像char[4][11]这样的二维数组与指向char*等字符(序列)的指针不同。

假设以下代码:

char *s = "Florida"; // lets pointer 's' point to a sequence of characters, i.e. { 'F', 'l', 'o', 'r', 'i', 'd', 'a', '\0' }
char arr[2][11] = { "Florida", "New York" };

然后像s[1]这样的表达式等同于*(s + sizeof(char))*(s+1),而arr[1]之类的表达式等同于*(arr + sizeof(char[11]))*(arr + 11) {1}},而不是*(arr + 1)。 “sizeof”-part由编译器完成,并从变量的类型派生。因此,类型char*的参数与类型char[11]的参数不同。

以下代码可能会帮助您转发:

void print (char array[][11], int n) {

    for(int i=0;i<n;i++)
        printf("%d:%s\n",i,array[i]);
}

int main() {

    char strStates[4][11] = { "aer", "adf", "awer", "aert" };
    print (strStates,4);

    return 0;
}