【C语言问题】同一个问题利用指针的两种实现,另一种出现问题,求大佬解答

题目:编写一个程序,输入5个城市名,按字母表顺序对这5个城市排序输出

这是一种实现方式


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 int main()
{
    char city[6][10]={"beijing","shenzhen","nanjing","dalian","shanghai","qingdao"};//存储城市名 
    char *ptstr[6];//指针数组
    int i;
    for(i=0;i<6;i++)
    {
        ptstr[i]=city[i];//令指针指向城市名 
    } 
    char *temp;
    int m,n;
    //用冒泡排序法进行排序
    for(m=1;m<6;m++)
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(ptstr[n-1],ptstr[n])>0)
            {
                temp=ptstr[n-1];
                ptstr[n-1]=ptstr[n];
                ptstr[n]=temp;
            }
        }
    }
    for(i=0;i<6;i++)
     puts(ptstr[i]);
    return 0;
}


但改用另一种方式就无法通过编译

另一种方式的实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char city[6][10];//存储城市名 
    int i;
    for(i=0;i<6;i++)
    {
        gets(city[i]);
    } 
    char *temp;
    int m,n;
    //用冒泡排序法进行排序
    for(m=1;m<6;m++)
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(city[n-1],city[n])>0)
            {
                temp=city[n-1];
                city[n-1]=city[n];
                city[n]=temp;
            }
        }
    }
    for(i=0;i<6;i++)
     puts(city[i]);
    return 0;
}


数组名同样是指向数组的指针,为何第二个版本的代码会出错

0

1个回答

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char city[6][10];//存储城市名 
    int i,j; //改
    for(i=0;i<6;i++)
    {
        gets(city[i]);
    } 
    char temp[10];
    int m,n;
    //用冒泡排序法进行排序
    for(m=0;m<6;m++) //改
    {
        for(n=1;n<6-m;n++)
        {
            if(strcmp(city[n-1],city[n])>0)
            {
                for (j = 0; j < 10; j++) //改
                {
                    temp[j]=city[n-1][j];
                    city[n-1][j]=city[n][j];
                    city[n][j]=temp[j];
                }
            }
        }
    }
    for(i=0;i<6;i++)
     puts(city[i]);
    return 0;
}
0
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 回复qq_18404993: 是的。第二个程序是二维数组,不能直接赋值
9 个月之前 回复
qq_18404993
Zijeak 还有,我想问一下,我两个版本的代码同样是用指针,但第二个就不行,是什么原因呢
9 个月之前 回复
qq_18404993
Zijeak 你的这个在排序的时候是不是将城市名的每一个字母都进行交换,进而达到交换两个城市名位置的目的。
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【数据结构】指针和链表问题,求大佬解答
![图片说明](https://img-ask.csdn.net/upload/201811/27/1543318209_622568.jpg)rn rn rn问题rn![图片说明](https://img-ask.csdn.net/upload/201811/27/1543318307_185667.jpg)rn```rn #include rn#include rn rn#define MAXSIZE 20rn rntypedef int ElemType; rntypedef structrnrn ElemType data;rn struct Node *next;rnNode,*LinkList;rn rnint main()rnrn //建立单链表rn LinkList LA;rn LA=(LinkList)malloc(sizeof(Node));rn LA->next=NULL;rn Node *r,*s;rn int c;rn r=LA;rn int flag=1,count=0; rn while(flag)rn rn printf("Please input new node to the LinkList,node must be intatger,input q to quit:\n");rn scanf("%d",&c);rn if(c!='q')rn rn s=(Node*)malloc(sizeof(Node));rn s->data=c;rn r->next=s;rn r=s;rn count++;rn rn elsern rn flag=0;rn r->next=NULL;rn rn rn Deal(&LA,count);rn rn //打印新生成的表rn printf("New LinkList is:\n");rn r=LA->next;rn while(r->next!=NULL)rn rn printf("%5d",r->data);rn rn return 0;rnrn rnint Deal(LinkList *LA,int n)//n为单链表长度,n为偶数 rnrn LinkList LB,LC;rn LB=(LinkList)malloc(sizeof(Node));//建立头结点rn LB->next=NULL;//建立空的单链表LBrn LC=(LinkList)malloc(sizeof(Node));//建立头结点rn LC->next=NULL;//建立空的单链表LCrn Node *p,*q,*r,*s; rn int i;rn p=LA->next->next;//令指针p指向序号为偶数的元素 rn q=LA->next;//令指针q指向序号为奇数的元素 rn r=LB;//令指针r指向LB rn s=LC;//令指针s指向LC rn rn rn //插入LB的第一个元素 rn LB->next=p;rn q->next=p->next;rn p=(p->next)->next;rn while(p->next!=NULL&&q->next!=NULL)rn rn //先插表LB rn //尾插法 (正序) rn s->next=q;rn LA=q->next;rn q=q->next->next;rn s=s->next; rn rn //头插法(逆序) rn p->next=LB->next;rn LB->next=p; rn p=p->next->next;rn rn rn //合并LB/LC两表rn if(p->next==NULL)rn rn p->next=LC->next;rn free(LC);rn rn return 0;rn rn rnrnrn```
字符数组的问题,求大佬解答
#includern#includernrnint main()rnrn const int size =29;rn int i;rn int ret=-1;rn char str[7][size]="sunday","monday","tuesday","wednesday","thursday","friday","saturday";rn char str1[size];rn gets(str1);rn rn 为什么用const定义他会warning,9 2 C:\Users\dell\Documents\未命名2.c [Error] variable-sized object may not be initialized字符串的数组定义没用常量,而用define定义就能编译呢?
AttributeError问题 求大佬解答
[img=https://img-bbs.csdn.net/upload/201801/09/1515429817_447527.png][/img]rnrn[code=python]from django.db import modelsrnrnclass Topic(models.Model):rn """用户学习的主题"""rn text = models.CharField(max_length=200)rn date_added = models.DataTimeField(auto_now_add=True)rnrn def _str_(self):rn '''返回模型的字符串表示'''rn return self.text[/code]rn rn脚本很简单 实在是不知道怎么出错了 就是运行不下去 求大佬解答啊
数据库范式问题求大佬解答!!!
1:关系模型R={A、B、C、D、E、G}其上存在函数依赖集F={BC->D,CD->AE,AG->CE,AB->GE}rna:证明BC为候选键。rnrnb:将R分解为R1=(ACDE),R2=(BCDG),请问R2是否满足BCNF?rnrnc:对于上面的分解,测试AG->ce,这个函数依赖是否被保持?rnrnd:请将R分解,是分解后的所有模式Rd至少满足3NF?rnrne:将R分解,是分解后的所有Rd满足BCNF?
c#问题 求大佬解答
用c#窗口怎么做要求输入的数组在一个text.box里面实现输入若干个正整数,以-1结束,找出其中的最大值,并求出它们的平均值。
指针问题,求大佬帮助!!~
[code=c]rn#include rn#define N 3rnrnrnint ScoreSort(int *score,int *pid) //按成绩由低到高排序 rnrn int i,j,t,s;rn rn for (i=0;i*(score+j+1))rn rn t=*(score+j);rn *(score+j)=*(score+1+j);rn *(score+1+j)=t; rn rn s=*(pid+j);rn *(pid+j)=*(pid+1+j);rn *(pid+1+j)=s;rn rn rn rn rn rn rnrnrnrnrnint ScoreCalculate(int *score,int *max,int *min,int *aver) //计算最高成绩、最低成绩及平均成绩 rnrn int total=0; rn int i;rn rn for(i=0;i*max)rn *max=*(score+i);rnrn rn for(i=0;i
C语言 指针问题 求大佬帮我看看 谢谢
copy_arr(target1, source, 5);,copy_ptr(target2, source, 5);这两个函数运行完成之后都是符合要求的,但copy_ptrs(target3, source, source + 5);运行后,前面两个复制的全变成垃圾值了,是我指针用错了吗?rn [img=https://img-bbs.csdn.net/upload/201902/17/1550411754_43980.jpg][/img][img=https://img-bbs.csdn.net/upload/201902/17/1550411754_244485.jpg][/img][img=https://img-bbs.csdn.net/upload/201902/17/1550411754_465317.jpg][/img][img=https://img-bbs.csdn.net/upload/201902/17/1550411754_737454.jpg][/img]rnrn[code=c]//将source的值通过三种方法复制到target1,target2,target3里面rn//使用带数组表示法的函数进行第一份拷贝。rn//使用带指针表示法和指针递增的函数进行第二份拷贝。rn//把目标数组名、源数组名和带靠背的元素个数作为前两个函数的参数。rn//第三个函数以目标数组名,源数组名和指向源数组最后一个元素后面的元素的指针。rnrn#include rnrnvoid copy_arr(double *a, double *b, int c); rnvoid copy_ptr(double *a, double *b, int c);rnvoid copy_ptrs(double *a, double *b, double *c);rnrnint main()rnrn double source[5] = 1.1, 2.2, 3.3, 4.4, 5.5;rn double target1[5];rn double target2[5];rn double target3[5];rn int i;rn rn copy_arr(target1, source, 5);rn copy_ptr(target2, source, 5);rn copy_ptrs(target3, source, source + 5);rn for(i = 0; i < 5; i++)rn printf("%10g%10g%10g%10g\n", source[i], target1[i], target2[i], target3[i]);rn rn return 0;rn rnrnvoid copy_arr(double *a, double *b, int c)rnrn int i;rn double *p = a;rn for(i = 0; i < c; i++)rn p[i] = b[i];rnrnrnvoid copy_ptr(double *a, double *b, int c)rnrn double *p = a;rn int i;rn for(i = 0; i < c; i++, p++)rn *p = b[i];rnrnrnvoid copy_ptrs(double *a, double *b, double *c)rnrn int i;rn double *p = a;rn for(i = 0; p != c; i++, p++)rn *p = b[i];rnrn[/code]
C语言指针问题求求解答
根据要求写出答案谢谢解答,另外提出char **p含义求告知![图片说明](https://img-ask.csdn.net/upload/201604/15/1460690520_370639.png)![图片说明](https://img-ask.csdn.net/upload/201604/15/1460690526_256685.png)![图片说明](https://img-ask.csdn.net/upload/201604/15/1460690531_973786.png)
c语言指针运行出现问题
#include #include #define N 10 int main() { int i; char s[10][20],*p[10]; int sort(char *q,int n); printf("INput %d string :\n",N); for(i=0;i<N;i++) { p[i]=s[i]; gets(p[i]); } printf("\n"
C语言解答的问题
问题:用C语言编写程序:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.........求出前20项之和rn答案:#include rnmain() rn rnint a=1,b=2,t,i; rnfloat sum=0; rnrnfor(i=1;i<=20;i++;) rn rnsum=sum+(float)b/a; rnt=a+b; rna=b; rnb=t; rn rnprintf("%d",sum); rnrn........................................................................rn请问一下,结果输出的 “printf("[color=#FF0000]%d[/color]",sum); ”这句正确吗?是不是应该输出printf("[color=#FF0000]%f[/color]",sum);呢?
指针利用(C语言)
在刷二级题库的时候看到这道题目,指针学的着实不够好,那就写一下写一下。 题目描述大体上是这样的:有这样一个字符串,由字母和*组成,删除其中所有的*,但是末尾的*不能删除。定义了一个指针已经指向了最后一个字母。 例如: ***AB***C*D***DCF****** 输出结果是:ABCDDCF****** 下面贴代码:
求解答C语言解答!
有一隻公雞往前走了一步,rn又往後走了三步,rn接著又往右走了兩步,rn最後又往左走了一步。 rnrn請問牠在哪裡下蛋呢?rnrn娱乐一下~
新人求解答~指针问题
代码是:rn#includernint main()rnrn int a,b;rn int *p,*q;rn scanf("%d,%d",&a,&b);rn p=&a;rn q=&b;rn printf("%d,%d\n",*p,*q);rn return 0;rnrn输入:89,98rn为什么结果会是89,4200736rn换了其他的两个数,都是第一个正常输出,第二个永远都是4200736··求解答?
指针问题求大神解答
#includernmain()rnrn int a=10,b=20,s,t,*pa,*pb;rn pa=&a;rn pb=&b;rn s=*pa+*pb;rn t=(*pa)**pa;rn printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);rn printf("s=%d\nt=%d\n",s,t);rnrnrn[color=#FF0000]问一下,为什么输出的时候显示的t=100而不是t=200啊[/color]
指针地址传递问题,求解答
# includernrnint main(void)rnrn int i = 6;rn int j = 8;rnrn rn printf("地址:%p\n",&i);rn printf("地址:%p\n",&j);rnrnrn f(&i,&j);rnrn printf("i = %d\tj = %d\t",i,j);rnrn return 0;rnrnint f(int * p,int * q)rnrn int * t;rn *t = *p;rn *p = *q;rn *q = *t;rnrn return 0;rnrn在被调函数里面建立临时指,返回时还是p和q的地址,互换还是地址里面的值。为什么在编译没出错,在执行后会程序错误无法执行。
c语言指针问题
假设指针是p,“整型值”是n,那么p+n表示指针p的指向向后移动了n个p所指向的元素所占有的空间值,即指向向后移动了n个元素。比如:char *p="1234567890"; 则p+4指向了5 若'1'的地址是2000 那么p+4就是2004; 若int x[]={1,2,3,4,5,6,7,8,9,0},*p; 则p+4也指向了5 但若1的地址仍是2000 p+4就是2000+4*4=2016了
C语言指针问题
请大家指点迷津*p++,*(p++),(*p)++的区别
C语言指针问题!
[code=C/C++]rn//程序1rn#include rnvoid swap(int *p1,int *p2)rnrn int p;rn p=*p1;rn *p1=*p2;rn *p2=p;rn printf("\n Swap:%d,%d",*p1,*p2);rn rnvoid main() rn rn int a,b;rn int *pa,*pb;rn printf("Input two number:");rn scanf("%d%d",&a,&b);rn *pa=a;rn *pb=b;rn if(arnvoid swap(int *p1,int *p2)rnrn int p;rn p=*p1;rn *p1=*p2;rn *p2=p;rn printf("\n Swap:%d,%d",*p1,*p2);rn rnvoid main() rn rn int a,b;rn int *pa,*pb;rn printf("Input two number:");rn scanf("%d%d",&a,&b);rn pa=&a;rn pb=&b;rn if(apa=&a等价的吗?
C 语言指针的问题
[code=C/C++]#include rn#include rnvoid GetNext(const char *p, int tmp[])rnrn int i = 0, j = 0;rn tmp[0] = strlen(p);rn tmp[1] = 0;rn while(i < 9)rn rn if((j == 0) || (p[i] == p[j]))rn rn ++i, ++j;rn tmp[i] = j;rn rn elsern j = tmp[j];rn rnrnvoid main()rnrn char *string = "abaabcac";rn int tmp[9];rn GetNext(string, tmp);rn printf("%s\n", string);rn for(int i = 0; i < 8; ++i)rn rn printf("%d\t", tmp[i]);rn rn putchar('\n');rn[/code]rnrn如上,问为什么在 main() 中输出 string 时报错?单步走的时候发现 string 的值被改变了。。。求问,为什么?谢谢
c语言指针的问题
今天有人问了我这个问题,我是从来没见过,求救啊rnrnint a[5]=1,2,3,4,5;rnint *ptr = (int *)((int)a +1);rnrn上面怎么解释?(int)a是什么意思?
C语言 指针问题
#includernint a=1,b=2;rnint *i,*j;rni=&a;rnj=&b;rnvoid change(int *i,int *j)rn int t;rn t=*i;rn *i=*j;rn *j=t;rnrnint main()rnrn change(i,j);rn printf("%d\n",a);rn printf("%d\n",b);rn return 0;rn
C语言指针的问题
int *p = &a[0];rnrn等效于rnrnint* *p;rnp = &a[0];rnrn与rnrnint* *p = a;rnrna为包含10个整型数据的数组 int a[10];rnrnint* *p 是什么意思?为什么用两个* *
c语言指针的问题!!
程序大概是这样的。rnrnfor(int i=0; i
c语言 指针问题
指针是C语言的一种类型,是C语言的精髓。 使用指针的优点: ①可以直接操作内存,效率更高 ②可以写复杂度更高的数据结构 ③编写出简洁、紧凑、高效的程序   数据声明的对比: int a  定义一个整型变量 int *a 定义一个指向整型数的指针,a指向个整型变量的地址,如: #include&amp;lt;stdio.h&amp;gt; void main() { int n=10; in...
C语言-指针问题
今天在翻阅于正冲老师的《C语言深度剖析》(希望我没写错字。)的时候遇到了一个问题很不解。想提出来,请精通C语言的大神帮助理解一下。谢谢。我是用WIN7 64位系统VC6.0编译如下截图程序查看内存结果如下截图。[img=https://img-bbs.csdn.net/upload/201308/22/1377136073_411676.jpg][/img]rnrn请问一下:rn1-对于图中画红色线的地方怎么会是这种结果呢?rn2-p1 和 (int *)(&a+1)的值不一样?p1直接指向了a数组的末端下一个int类型数,而后者指向了a[0]的第一字节。求解释额。。谢谢。。。
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo