c语言中指针数组和字符串数组的区别 ,高手请进!
要对几个字符串排序后输出。两个程序,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都...
要对几个字符串排序后输出。
两个程序,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都是表示指向一个字符串的一级指针吗?二者有什么不同?为什么第二个是错的?
程序一:
#include "stdio.h"
main()
{char *line[]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char *v[];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}
writeline(linp,n)
char *linp[];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
程序二:
#include "stdio.h"
main()
{char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char v[][10];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}
writeline(linp,n)
char linp[][10];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
字符串数组中v[i]不也可以表示指向这个字符串第一个字符的一级指针吗? 展开
两个程序,只是对数组的定义不同,第一个定义的是指针数组,是对的;第二个定义的是字符串数组,却是错的。指针数组的v[i]和字符串数组的v[i]不都是表示指向一个字符串的一级指针吗?二者有什么不同?为什么第二个是错的?
程序一:
#include "stdio.h"
main()
{char *line[]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char *v[];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}
writeline(linp,n)
char *linp[];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
程序二:
#include "stdio.h"
main()
{char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(v,n)
char v[][10];
int n;
{char *t;
int i,j;
for(i=0;i<n-2;i++)
{for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
}
}
writeline(linp,n)
char linp[][10];
int n;
{int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
字符串数组中v[i]不也可以表示指向这个字符串第一个字符的一级指针吗? 展开
3个回答
展开全部
#include "stdio.h"
#include "string.h"
void shellsort(char v[][10], int n);
void writeline(char linp[][10],int n);
main()
{
char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(char v[][10], int n)
{
char *temp,*t[5];
int i,j;
for(i=0;i<n;i++)
t[i]=&v[i];
for(i=0;i<n-2;i++)
for(j=n-1;j>i;j--)
if(strcmp(t[j-1],t[j])>0)
{
temp=t[j];
t[j]=t[j-1];
t[j-1]=temp;}
}
writeline(char linp[][10],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
上面是修改过的程序;
关键在于
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
这里面的v[j]=v[j-1];这句不对,因为这是两个地址,也是两个数组,不能赋值
我用了另外的一组指针来指向这个数组
你的函数的定义很奇怪,更奇怪这样的定义也能编译
建议象我这样定义吧,不然别人看程序很困难的.
#include "string.h"
void shellsort(char v[][10], int n);
void writeline(char linp[][10],int n);
main()
{
char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(char v[][10], int n)
{
char *temp,*t[5];
int i,j;
for(i=0;i<n;i++)
t[i]=&v[i];
for(i=0;i<n-2;i++)
for(j=n-1;j>i;j--)
if(strcmp(t[j-1],t[j])>0)
{
temp=t[j];
t[j]=t[j-1];
t[j-1]=temp;}
}
writeline(char linp[][10],int n)
{
int i;
for(i=0;i<n;i++)
printf("%s\n",linp[i]);
}
上面是修改过的程序;
关键在于
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
这里面的v[j]=v[j-1];这句不对,因为这是两个地址,也是两个数组,不能赋值
我用了另外的一组指针来指向这个数组
你的函数的定义很奇怪,更奇怪这样的定义也能编译
建议象我这样定义吧,不然别人看程序很困难的.
展开全部
指针数组的内容是v[i]的地址,字符串数组的v[i]是第i项的内容.值和地址不一回事.了解一下指针的定义.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
方法一用来交换字符串的原理是改变指针数组成员指向的地址,这没有问题。
但是如果把line声明成2维数组,数组的地址值是不能随意修改的,所以,你无法强制把line[0]指定到其他地方。
可把方法二的字符串交换处理作如下改动:
{
char
t[10];
int
i,j;
for(i=0;i<n-2;i++)
{
for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{
/*t=v[j];v[j]=v[j-1];v[j-1]=t;*/
strcpy(t,
v[j]);
strcpy(v[j],
v[j-1]);
strcpy(v[j-1],
t);
}
}
但是如果把line声明成2维数组,数组的地址值是不能随意修改的,所以,你无法强制把line[0]指定到其他地方。
可把方法二的字符串交换处理作如下改动:
{
char
t[10];
int
i,j;
for(i=0;i<n-2;i++)
{
for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{
/*t=v[j];v[j]=v[j-1];v[j-1]=t;*/
strcpy(t,
v[j]);
strcpy(v[j],
v[j-1]);
strcpy(v[j-1],
t);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询