读书人

二位字符数组的排序。解决办法

发布时间: 2013-04-21 21:18:07 作者: rapoo

二位字符数组的排序。


#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
char c[5][10] = {"zabd", "fadkfjdkb", "fadkfjdka", "egaoba", "beyond"};
int count = sizeof(c) / 10;


for(int i = 0; i < count - 1; i++)
{
int k = i;

for(int j = i + 1; j < count; j++)
{
if(strcmp(c[i] , c[j]) > 0)
{
k = j;
}
}


if(i != k)
{
char (*str)[10];
str = c[k];
c[k] = c[i];
c[i] = str;
}

}



for(int i = 0; i < count; i++)
{
printf("%s\n", c[i]);
}

printf("\ncount = %d\n", count);
printf("\n");
system("pause");
return 0;
}


如上所示,我要把“”中的字符串按照字母顺序排列,但是我这样写不行,应该怎么处理呢?
VS2010环境下。
[解决办法]
void str_sort()
{
char c[5][10] = {"zabd", "fadkfjdkb", "fadkfjdka", "egaoba", "beyond"};
int count = sizeof(c) / 10;


for(int i = 0; i < count - 1; i++)
{
int k = i;

for(int j = i + 1; j < count; j++)
{
if(strcmp(c[i] , c[j]) > 0)
{
k = j;
}
}


if(i != k)
{
char str[10];
strncpy(str, c[k], 10);
strncpy(c[k], c[i], 10);
strncpy(c[i], str, 10);
}

}



for(int i = 0; i < count; i++)
{
printf("%s\n", c[i]);
}

printf("\ncount = %d\n", count);
printf("\n");
}

beyond
egaoba
fadkfjdka
fadkfjdkb
zabd
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
char c[][10] = { "zabd", "fadkfjdkb", "fadkfjdka", "egaoba", "beyond", "meyond", "oeper" };


int count = sizeof(c) / sizeof(c[0]);

for (int i = 0; i < count - 1; i++)
{
int k = i;
for (int j = i + 1; j < count; j++)
{
if (strcmp(c[k], c[j]) > 0)
{
k = j;
}
}

if (i != k)
{
char str[10];
strncpy(str, c[k], 10);
strncpy(c[k], c[i], 10);
strncpy(c[i], str, 10);
}
}

for (int i = 0; i < count; i++)
{
printf("%s\n", c[i]);
}
printf("\ncount = %d\n", count);
printf("\n");

system("pause");
return 0;
}


[解决办法]
选择排序的思想就可以实现了:
#include <stdio.h>
#include <string.h>
int main()
{
char st[20],cs[10][20];
int i,j,p;

printf("分别输入十个英文字符串(以输入键分隔):\n");
for(i=0;i<10;i++) //完成输入
gets(cs[i]);
printf("\n");

printf("按字母顺序从小到大排列:\n"); //选择排序的思想
for(i=0;i<10;i++)
{
p=i; //设i位置的是最小元素
strcpy(st,cs[i]);
for(j=i+1;j<10;j++) //从剩下的里面取出一个与这个当前的比较大小,如果新取出的元素小,则把这个元素放在假设的最小位置上
if(strcmp(cs[j],st)<0)
{
p=j;
strcpy(st,cs[j]);
}

if(p!=i) //如果假设的位置上的元素不是最小的,则交换位置
{
strcpy(st,cs[i]);
strcpy(cs[i],cs[p]);
strcpy(cs[p],st);
}

puts(cs[i]); //输出
}

printf("\n");
}
------解决方案--------------------


char c[][10] = {"zabd", "fadkfjdkb", "fadkfjdka", "egaoba", "beyond", "meyond", "oeper"};
这是程序的另外一个错误

例子中虽然运行正确了,但是如果把c数组改为以下就会运行错误,lz可以try下,看看有没有道理
char c[][3] = {"za", "fb", "fa", "e", "b", "m", "oe"};

正确的如下:
char *c[] = {"zabd", "fadkfjdkb", "fadkfjdka", "egaoba", "beyond", "meyond", "oeper"};
count = sizeof(c) / sizeof(char *);
[解决办法]
为什么不用qsort函数?

读书人网 >C语言

热点推荐