我试图编写一个代码,按字母顺序或反向字母顺序对字符串数组进行排序,具体取决于给定的命令行参数。
" -o a"字母。
" -o r"反向。
到目前为止,这是我的代码。
#include<stdio.h>
#include<string.h>
int string_compare(char *str1,char *str2){
int ret;
ret=strcmp(str1,str2);
if(ret < 0) {
return 0;
}
else if(ret > 0) {
return 1;
}
else {
return -1;
}
}
void swap(char *str1, char *str2)
{
char *temp = str1;
str1 = str2;
str2 = temp;
}
int main(int argc,char *argv[]){
char *planets[9]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
int i,j;
int a_ret=strcmp(argv[2],"a");
int r_ret=strcmp(argv[2],"r");
int cmp;
for(i=0;i=8;i++){
for(j=8;j=(i+1);j--){
cmp=string_compare(planets[j],planets[j-1]);
if(a_ret==0){
if(cmp==0){
swap(planets[j],planets[j-1]);
}
}
else if(r_ret==0){
if(cmp==1){
swap(planets[j],planets[j-1]);
}
}
}
}
printf("%s",planets[0]);
return 0;
}
该程序应该是这样的:
./planets –o a
The planets in alphabetical order are: Earth, Jupiter, Mars, Mercury, Neptune, Pluto, Saturn, Uranus, Venus
或者这个:
./planets –o r
The planets in reverse alphabetical order are: Venus, Uranus, Saturn, Pluto, Neptune, Mercury, Mars, Jupiter, Earth
程序编译没有错误,但是当我运行它时我得到了
Segmentation fault(core dumped)
我是C的新手,我并不完全了解如何操作内存分配。非常感谢任何帮助或建议。
答案 0 :(得分:0)
在for
循环中,您使用的是=
运算符,而不是<=
或>=
。
注意:还有其他logical errors
。
<强>更新:强>
您可以使用以下代码:
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 9
void swap(char **str1, char **str2)
{
char *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
int main(int argc,char *argv[]){
char *planets[MAX_SIZE]= {"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
int i, j, cmp, minMax;
//If we don't need an array sorted in accending order then it is obvious that
//we need it to be sorted in decending order
int a_ret= (strcmp(argv[2],"a") == 0);
for(i=0;i<MAX_SIZE;i++){
minMax = i;
for(j=i+1;j<MAX_SIZE;j++){
cmp=strcmp(planets[j],planets[minMax]);
if(((a_ret==0) && (cmp>0)) || ((a_ret==1) && (cmp<0))){
minMax =j;
}
}
//Swap only if required
if(i != minMax)
swap(&planets[i], &planets[minMax]);
}
//Print the sorted array
for(i=0;i<MAX_SIZE;i++)
printf("%s | ",planets[i]);
return 0;
}
您可以看到工作代码here(由于在线IDE限制,也未提供命令行参数)。
答案 1 :(得分:-1)
我修复了指出的逻辑错误和swap
函数,程序运行时没有崩溃。结果大多是正确的,除了&#34; Mercury&#34;。
当前节目:
#include<stdio.h>
#include<string.h>
int string_compare(char *str1,char *str2){
int ret;
ret=strcmp(str1,str2);
if(ret < 0) {
return 0;
}
else if(ret > 0) {
return 1;
}
else {
return -1;
}
}
void swap(char** s1, char** s2)
{
char* temp = *s1;
*s1 = *s2;
*s2 = temp;
}
int main(int argc,char *argv[]){
char *planets[9]={"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto"};
int i,j;
int a_ret=strcmp(argv[2],"a");
int r_ret=strcmp(argv[2],"r");
int cmp;
for(i=0;i<8;i++){
for(j=i+1;j<=8;j++){
cmp=string_compare(planets[j-1],planets[j]);
if(a_ret==0){
if(cmp==1){
swap(&planets[j-1],&planets[j]);
}
}
else if(r_ret==0){
if(cmp==0){
swap(&planets[j-1],&planets[j]);
}
}
}
}
for(int k=0;k<=8;k++){
printf("%s,",planets[k]);
}
printf("\n");
return 0;
}
命令行参数-o a
的结果:
Mercury,Earth,Jupiter,Mars,Neptune,Pluto,Saturn,Uranus,Venus,
程序似乎跳过了数组中的第一个字符串。