对预定义的名称列表进行排序
Sorting a pre-defined list of names
我正在研究 C Programming for the Absolute Beginner 第 2 版的第 8 章挑战 3。该程序应该按字母顺序对一组名称进行排序。
我的程序不工作。没有 sort()
的 main 函数可以工作,但是 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);
}
}
}
}
这不是回答,而是让您继续前进的提示。像 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', '[=10=]' }
char arr[2][11] = { "Florida", "New York" };
那么像s[1]
这样的表达式等价于*(s + sizeof(char))
,也就是*(s+1)
,而像arr[1]
这样的表达式等价于*(arr + sizeof(char[11]))
,也就是是 *(arr + 11)
,而不是 *(arr + 1)
。 "sizeof" 部分由编译器完成,并派生自变量的类型。因此,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;
}
我正在研究 C Programming for the Absolute Beginner 第 2 版的第 8 章挑战 3。该程序应该按字母顺序对一组名称进行排序。
我的程序不工作。没有 sort()
的 main 函数可以工作,但是 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);
}
}
}
}
这不是回答,而是让您继续前进的提示。像 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', '[=10=]' }
char arr[2][11] = { "Florida", "New York" };
那么像s[1]
这样的表达式等价于*(s + sizeof(char))
,也就是*(s+1)
,而像arr[1]
这样的表达式等价于*(arr + sizeof(char[11]))
,也就是是 *(arr + 11)
,而不是 *(arr + 1)
。 "sizeof" 部分由编译器完成,并派生自变量的类型。因此,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;
}