一道指针数组问题 求解答 (字符串排序)
#include<stdio.h>#include<string.h>
int main()
{
int n,i;
char a,*p;
void s(char*p[],int n);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a);
p=a;
}
s(p,n);
for(i=0;i<n;i++)
printf("%s\n",p);
return 0;
}
void s(char *p1[],int n)
{
int j,k;
char *t;
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strcmp(p1,p1)>0)
{
t=p1;
p1=p1;
p1=t;
}
}
上面是正确做法
下面是错误做法
#include<stdio.h>
#include<string.h>
int main()
{
int n,i;
char a,*p;
void s(char*p[],int n);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",a);
p=a;
}
s(p,n);
for(i=0;i<n;i++)
printf("%s\n",*p);
return 0;
}
void s(char *p1[],int n)
{
int j,k;
char t;
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(strcmp(p1,p1)>0)
{
t=*p1;
*p1=*p1;
*p1=t;
}
}
为什么输出我改成输出*p【i】就不行了?而p不是代表地址吗?
题目如下字符串排序
Sample Input
5
red
blue
yellow
green
purple
Sample Output
blue
green
purple
red
yellow
本帖最后由 mingcxx 于 2016-4-19 00:23 编辑
p:是第i个字符串的地址,也是指向第i个字符串首字符的指针(地址)
*p: 取值运算符取出第i个字符串的首字符。
printf("%s", p); 表示从p指向的字符开始依次向后打印每个字符,直到遇到空字符为止。所以,打印字符串实际上是在传递字符串的地址(或者更准确说是字符串首元素的地址),函数本身自动打印该字符到第一个空字符之间的所有字符,也就是打印了所谓的字符串。
printf("%s", *p);语法错误,打印字符串需要传递字符串地址p,而不是字符串首字符*p。编译器不检查printf()的参数错误,调试运行一定有内存访问报错。
再说字符串排序:对指向字符串的指针排序。
排序代码部分:
t=*p1;
*p1=*p1;
*p1=t;
错,多了*号之后,原本交换指针值变成了交换对应字符串的首元素。假定没有其他编程错误,
调试运行:发现每个字符串的首元素都变成了其他字符串的首元素按序排列。
建议巩固基础。 过来看看 过来看看
页:
[1]