C语言字符串排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言字符串排序相关的知识,希望对你有一定的参考价值。

字符太长,错误排查不了,可能能力问题吧。。麻烦帮忙在编译器上跑跑,纠正下错误。。
自学,没老师教可真恼火。。
#include<stdio.h>
#include<string.h>
#define MAX 10
void stsrt(char * str,int num);
void ASC(char * str,int num);
void length_add(char * str,int num);
void word_length(char * str,int num);
int main(void)

char *s[MAX];
int ct=0;
int n;
puts("输入10个字符串");
while(ct<MAX&&gets(s[ct])&&s[ct][0]!='\0')
ct++;
puts("选择");
puts("1.输出初始字符串列表;");
puts("2.按ASCⅡ码顺序输出字符串;");
puts("3.按长度递增顺序输出字符串;");
puts("4.按字符串第一个单词长度输出字符串;");
while(scanf("%d",&n)!=5)

switch(n)

case 1:stsrt(s[],ct);
break;
case 2:ASC(s[],ct);
break;
case 3:length_add(s[],ct);
break;
case 4:word_length(s[],ct);
break;
case 5:quit;
default:printf("输入错误");


return 0;


void stsrt(char * str,int num) //1.输出初始字符串列表

int n;
for(n=0;n<num;n++)
puts(s[num]);


void ASC(char * str,int num) //2.按ASCⅡ码顺序输出字符串

int top,seek;
char *temp;

for(top=0;top<num-1;top++)
for(seek=top+1;seek<num;seek++)
if(strcmp(str[top],str[seek])>0)

temp=str[top];
str[top]=str[seek];
str[seek]=temp;

for(int n=0;n<num;n++)
puts(str[n]);


void length_add(char * str,int num) //3.按长度递增顺序输出字符串

char * temp;
int top,seek;
for(top=0;top<num-1;top++)
for(seek=top+1;seek<num;seek++)
if(strlen(str[top])>strlen(str[seek]))

temp=str[top];
str[top]=str[seek];
str[seek]=temp;

for(int n=0;n<num;n++)
puts(str[n]);


void word_length(char * str,int num)//4.按字符串第一个单词长度输出字符串.这个函数我觉得可能行不通

char * temp;
int top,seek,n;

for(top=0;top<num-1;top++)
for(seek=top+1;seek<num;seek++)
while(str[top]!=' '&&str[seek]!=' ')
if(strlen(str[top])>strlen(str[seek]))

temp=str[top];
str[top]=str[seek];
str[seek]=temp;

for(n=0;n<num;n++)
puts(str[n]);


有点长,送上50分。。谢谢先

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MAX 10

void stsrt(char *str[],int num);
void ASC(char *str[],int num);
void length_add(char *str[],int num);
void word_length(char *str[],int num);

int main(void)
char *s[MAX],t[80];
int i = 0,n;
printf("输入%d个字符串 :\n",MAX);
for(i = 0; i < MAX; ++i)
if(gets(t) && t[0] != '\0')
s[i] = (char *)malloc(80 * sizeof(char));
strcpy(s[i],t);

else break;

while(i < MAX && gets(s[i]) && s[i][0] != '\0') i++;
puts("选择:");
puts("1.输出初始字符串列表");
puts("2.按ASCⅡ码顺序输出字符串");
puts("3.按长度递增顺序输出字符串");
puts("4.按字符串第一个单词长度输出字符串");
puts("5.结束");
while(scanf("%d",&n) != 5)
switch(n)
case 1:stsrt(s,i);break;
case 2:ASC(s,i);break;
case 3:length_add(s,i);break;
case 4:word_length(s,i);break;
case 5:return 0;
default:puts("输入错误!");


return 0;


void stsrt(char *str[],int num) //1.输出初始字符串列表
int n;
for(n = 0;n < num;n++) puts(str[num]);


void ASC(char *str[],int num) //2.按ASCⅡ码顺序输出字符串
int top,seek;
char *temp;
for(top = 0;top < num - 1;top++)
for(seek = top + 1;seek < num;seek++)
if(strcmp(str[top],str[seek]) > 0)
temp = str[top];
str[top] = str[seek];
str[seek] = temp;


for(int n = 0;n < num;n++) puts(str[n]);


void length_add(char *str[],int num) //3.按长度递增顺序输出字符串
char *temp;
int top,seek;
for(top = 0;top < num - 1;top++)
for(seek = top + 1;seek < num;seek++)
if(strlen(str[top]) > strlen(str[seek]))
temp = str[top];
str[top] = str[seek];
str[seek] = temp;


for(int n = 0;n < num;n++) puts(str[n]);


void word_length(char *str[],int num) //4.按字符串第一个单词长度输出字符串
char *temp;
int top,seek,n,j,len[MAX];
for(n = 0; n < num; ++n)
len[n] = 0;
j = 0;
while((str[n][j] != ' ') && str[n][j])
++len[n];
++j;


for(top = 0;top < num - 1;top++)
for(seek = top + 1; seek < num;seek++)
if(len[top] > len[seek])
temp = str[top];
str[top] = str[seek];
str[seek] = temp;



for(n = 0;n < num;n++) puts(str[n]);
参考技术A 。。。满篇的错误:
i.c: 在函数‘main’中:
i.c:25:24: 错误: expected expression before ‘]’ token
i.c:27:22: 错误: expected expression before ‘]’ token
i.c:29:29: 错误: expected expression before ‘]’ token
i.c:31:30: 错误: expected expression before ‘]’ token
i.c:33:16: 错误: ‘quit’未声明(在此函数内第一次使用)
i.c:33:16: 附注: 每个未声明的标识符在其出现的函数内只报告一次
i.c: 在函数‘stsrt’中:
i.c:44:14: 错误: ‘s’未声明(在此函数内第一次使用)
i.c: 在函数‘ASC’中:
i.c:54:13: 警告: 传递‘strcmp’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:143:12: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:54:13: 警告: 传递‘strcmp’的第 2 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:143:12: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:56:21: 警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
i.c:58:26: 警告: 赋值时将指针赋给整数,未作类型转换 [默认启用]
i.c:60:5: 错误: 只允许在 C99 模式下使用‘for’循环初始化声明
i.c:60:5: 附注: 使用 -std=c99 或 -std=gnu99 来编译您的代码
i.c:61:5: 警告: 传递‘puts’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/stdio.h:692:12: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c: 在函数‘length_add’中:
i.c:70:13: 警告: 传递‘strlen’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:399:15: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:70:13: 警告: 传递‘strlen’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:399:15: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:72:21: 警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
i.c:74:26: 警告: 赋值时将指针赋给整数,未作类型转换 [默认启用]
i.c:76:5: 错误: 只允许在 C99 模式下使用‘for’循环初始化声明
i.c:77:9: 警告: 传递‘puts’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/stdio.h:692:12: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c: 在函数‘word_length’中:
i.c:88:17: 警告: 传递‘strlen’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:399:15: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:88:17: 警告: 传递‘strlen’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/string.h:399:15: 附注: 需要类型‘const char *’,但实参的类型为‘char’
i.c:90:25: 警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
i.c:92:30: 警告: 赋值时将指针赋给整数,未作类型转换 [默认启用]
i.c:95:9: 警告: 传递‘puts’的第 1 个参数时将整数赋给指针,未作类型转换 [默认启用]
/usr/include/stdio.h:692:12: 附注: 需要类型‘const char *’,但实参的类型为‘char’

你自己看看吧,先解决一下,如有解决不了告诉我。我直接帮你全部改了对你没有帮助,毕竟你想提高自己的写代码能力,不是吗?
参考技术B while(ct<MAX&&gets(s[ct])&&s[ct][0]!='\0')
ct++;
建议不要在while的判断中有输入运算,不好掌握。
逻辑上有问题,在s没有输入的时候,是不确定的随机数,所以这个判断循环的条件无法确定
while(scanf("%d",&n)!=5)
这个scanf的返回值不是n的值,这个你可以查一下,所以这里是个死循环
你想要循环使用,把puts列表也包含进去

char *s[MAX];你定义的这个,好像不行,我试验过,不会输出任何东西,因为指针没有申请内存

case 5:quit;,后面什么意思,退出程序的函数是exit();

c语言 向字符串中插入字符并排序

(1)从键盘用gets函数输入从小到大有序排列的字符串(不多于80个字符)后,再将字符‘k’插入其中,使其仍然有序。
如输入:acfhhlprsyz,则输出:acfhhklprsyz。
(2)从键盘输入一个所含字符从小到大有序排列的字符串(不多于40个字符)后,再输入一个字符插入其中,使其仍然有序,然后输出。例如:
输入:#255BKacfhhlprsyz
再输入:G
输出:#255BGKacfhhlprsyz

/*添加注释,排序子程序,插入子程序*/
#include<stdio.h>
#include<string.h>
/*交换两个字符子程序*/
void swap(char *num1,char *num2)

char ch;
ch = *num1;
*num1 = *num2;
*num2 = ch;

/*排序子程序由小及大*/
void pai_xu(char *p)

int i,j,len;
len = strlen(p);
for(i = 0;i < len -1;i++)
for(j = i+ 1;j < len;j++)
if(p[i] > p[j])swap(&p[i],&p[j]);



/*插入子程序,返回新字符串的长度*/
int cha_ru(char *src,char wait)

char *pointer;
int len;
len = strlen(src);
pointer = src + len + 1;
*pointer = '\0';
pointer -= 2;
while(pointer >= src)
if(*pointer >= wait) *(pointer+1) = *pointer;
else
*(pointer+1) = wait;break;

pointer--;

if(pointer < src) *(pointer+1) = wait;
return len+1;


/************************主函数*****************************/
int main(void)

char ch,a[80],*p;
int i,len;
printf("\n输入一个字符串:\n");
gets(a); /*输入字符串*/
pai_xu(a);/* 排序子程序*/
printf("%s\n",a);
printf("\n请输入待插入的字符:\n");
scanf("%c",&ch);
cha_ru(a,ch);
printf("\n%s\n",a);
return 0;
参考技术A #include "stdio.h"
#include "string.h"
void main()

char s[80];
char s2[81];
int j = 0,m =0;
gets(s);
for(int i = 0;i <=20;i++,j++)

if(s[i] > 'k' && m == 0)

s2[j] = 'k';
j++;
s2[j] = s[i];
m++;

else
s2[j] = s[i];

cout<<s2;


/////////////////////////////
#include "stdio.h"
#include "string.h"
#include "iostream.h"
void main()

char s[80];
char s2[81];
char s3;
int j = 0,m =0;
gets(s);
scanf("%c",&s3);
for(int i = 0;i <=20;i++,j++)

if(s[i] > s3 && m == 0)

s2[j] = s3;
j++;
s2[j] = s[i];
m++;

else
s2[j] = s[i];

cout<<s2;

以上是关于C语言字符串排序的主要内容,如果未能解决你的问题,请参考以下文章

c语言字符串排序

C语言问题:将一字符串按ASCII大小排序

C语言字符串排序

Go语言 排序与搜索切片

求c语言高手,ASCII码排序

c语言 向字符串中插入字符并排序