动态字符数组和字符数组

tangfangyuyu 2010-11-13 11:23:12
/*
2. 字符串处理
从标准输入中读入N(1<N<10000)行以换行符结束且长度不超过2048的
字符串,并在输入结束后输出其中最长10行的输入序号、长度和内容。
当有多行长度相等的最长行时,输出最先输入的行的信息。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void *p,const void *q)
{
return strcmp((char*)p,(char*)q);
}

void String_manipulation(int N_link)
{
int i,n;
char **p = new char* [N_link];/* 如果不定义动态二维数组 、 输入就没有错误 */

for( n = 0;n < N_link; n++)
{
p[n]= new char [2048];
}

printf("Input string: \n");
for(n=0;n<N_link;n++)
{
scanf("%s",p[n]);/*输入时出现错误*/
}
/*
字符串数组的排序
*/
qsort((void*)p,N_link,sizeof(p[0]),cmp);

for(i=0,n=N_link;i<2;i++)
{
printf("%s",p[n]);
}
}

int main()
{
int N;
scanf("%d",&N);
String_manipulation(N);
return 0;
}

/*
如果不定义动态二维数组 输入就没有错误
字符串数组的排序
*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

char a[20005][25];/* 如果不定义动态二维数组 输入就没有错误 */

int cmp(const void *p,const void *q)
{
return strcmp((char*)p,(char*)q);
}
int main()
{
int n,i;
while(1)
{
scanf("%d",&n);
if(n==0) break;
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}

qsort((void*)a,n,sizeof(a[0]),cmp);

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

这是怎么 回事 为什么定义成动态数组之后就会出现错误?
...全文
724 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangfangyuyu 2010-11-16
  • 打赏
  • 举报
回复
找到问题的答案了

/*
动态分配的cmp应该解引用:
*/
int cmp( const void *a, const void *b)
{
char *s1 = *(char **)a,
char *s2 = *(char **)b;

if (strlen(s1) != strlen(s2))
return strlen(s1) - strlen(s2);
return strcmp(s1, s2);

}
angel_su 2010-11-14
  • 打赏
  • 举报
回复
动态那个传给qsort是指针数组,cmp函数还要解引用,类似:
strlen(*(char *)a) - strlen(*(char *)b)

另外qsort不是稳定排序,不能保证先输入同大小就排前,,长度数值2048有限可改用基数排序...
tangfangyuyu 2010-11-14
  • 打赏
  • 举报
回复
谢谢 问题解决了!!!

但下面两个程序的结果怎么会不一样,感觉没什么不同的
前面的是 动态定义
char **p = new char* [N_link];

for( n = 0;n < N_link; n++)
{
p[n]= new char [2048];
}
后面的是已经定义好的 a[5][2048]

结果后面的符合要求
前面动态定义的不符合要求
(排序的规则为:先比较两个字符串的长度,长度短的字符串排在前面,如果长度相等,则比较字符串的值,按从小到大排序输出。 )

/*
2. 字符串处理
从标准输入中读入N(1<N<10000)行以换行符结束且长度不超过2048的
字符串,并在输入结束后输出其中最长10行的输入序号、长度和内容。
当有多行长度相等的最长行时,输出最先输入的行的信息。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp( const void *a, const void *b)
{
if (strlen((char *)a) != strlen((char *)b))
return strlen((char *)a) - strlen((char *)b);
return( strcmp((char *)a,(char *)b) );
}

void String_manipulation(int N_link)
{
int i,n;
char **p = new char* [N_link];

for( n = 0;n < N_link; n++)
{
p[n]= new char [2048];
}

printf("Input string: \n");
for(n = 0;n < N_link; n++)
{
scanf("%s",p[n]);
}

qsort((void*)p,N_link,sizeof(p[0]),cmp);

for(i = 0; i < N_link; i++)
{
printf("%s\n",p[i]);//注意不要越界
}
}

int main()
{
int N;
printf("input N : ");
scanf("%d",&N);
String_manipulation(N);
return 0;
}
输出结果为:
input N: 5
Input string :
January
February
March
April
output string :
May
January
February
March
April


#include <iostream.h>
#include "string.h "
#include "stdlib.h "

int cmp(const void *a, const void *b);

void main()
{
char a[5][2048]={ "January ", "February ", "March ", "April ", "May "};

qsort((void *)a,5,2048,cmp);

for(int i=0;i <5;i++)
{
cout <<a[i]<<endl;
}
}
int cmp( const void *a, const void *b)
{
if (strlen((char *)a) != strlen((char *)b))
return strlen((char *)a) - strlen((char *)b);
return( strcmp((char *)a,(char *)b) );
}


输出结果为:
May
April
March
January
February
Csuxiaowu 2010-11-13
  • 打赏
  • 举报
回复
for(i=0,n=N_link;i<2;i++)
{
printf("%s",p[n]);
}
n = N_link 然后打印 p[n] 越界了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧