| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1147 人关注过本帖
标题:帮我分析一个小程序,自己不会呀!
只看楼主 加入收藏
李沫沫
Rank: 2
来 自:唐山
等 级:论坛游民
帖 子:35
专家分:13
注 册:2013-3-14
结帖率:80%
收藏
已结贴  问题点数:50 回复次数:11 
帮我分析一个小程序,自己不会呀!
#include"stdio.h"  #include"string.h"

void fun (char *w,int m){char s,*p1,*p2; p1=w; p2=w+m-1;

                           while(p1<p2){s=*p1++;*p1=*p2--;*p2=s;}}

main( ){char a[ ]="ABCDfG";  fun(a,strlen(a));  puts(a);}



我想知道当上述程序运行时,p2=w+m-1怎么运行,老师让写分析,到这里我就不会了。结果是AGAAGAG
搜索更多相关主题的帖子: include 
2013-05-22 19:52
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:10 
这样:
    p2=w+m-1;//p2指向字符串a的最后一个字符 G 

主要搞糊涂的内容是while的循环体,用用调试功能吧,你可以看到它是一步步怎么变换的。

Edsger Dijkstra:算法+数据结构=程序
2013-05-22 20:04
我叫沃恩
Rank: 12Rank: 12Rank: 12
来 自:Asia
等 级:贵宾
威 望:10
帖 子:1234
专家分:3865
注 册:2013-3-29
收藏
得分:5 
学习!

因为我是菜鸟,所以应该被骂! 细节+坚持=成功!
2013-05-22 20:19
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:20 
你们老师教你们写程序就教这种格式?

p2 = w + m - 1;

p2指向字符串最后一个字符..就是'G';

因为 strlen的返回值是字符串的长度(不包括\0),

所以 strlen(a) == 6 , m == 6;

w是字符数组的首地址, 而地址在内存中是一个无符号整数

对字符类型数组的地址进行加法运算,加 1 就表示 地址值 加 上 1个字节(因为字符类型占用1字节内存空间)
所以 w 加 m  就是 w 的地址加上 m * 1 个字节 ,再减 1 就是减去 1 个字节


结果为 w的地址加上5 ,再把这个地址赋值给字符类型指针 p2



表达能力有限....
2013-05-22 20:27
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:15 
函数的功能是不是想完成字符串的反转,如下的函数完成字符串的反转:
void fun (char *w,int m)
{
     char s,*p1,*p2;
     p1=w;
     p2=w+m-1;
     while(p1<p2)
     {
       s=*p1;
       *p1++=*p2;
       *p2--=s;
       }
}
2013-05-22 21:12
李沫沫
Rank: 2
来 自:唐山
等 级:论坛游民
帖 子:35
专家分:13
注 册:2013-3-14
收藏
得分:0 
回复 4楼 Ryker
表示:这是按照老师写的书上写的。我们老师讲课天马星空。没头绪。所以听不懂

沫沫、努力学习呀!c++我来了!
2013-05-22 21:53
Ryker
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:145
专家分:420
注 册:2013-2-19
收藏
得分:0 
#include <stdio.h>
#define LSSB(X) int main(void){printf(#X"\n");return 0;}
LSSB(凸(艹皿艹 ))

这段代码让你们老师编译运行 ...
2013-05-22 22:53
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include "stdio.h"
#include "string.h"

void fun(char *w, int m)
{
    char s, *p1, *p2;

    p1 = w;
    p2 = w + m - 1;

    while(p1 < p2)
    {
        s   = *p1++;     puts(w);
        *p1 = *p2--;     puts(w);
        *p2 = s;         puts(w);

        puts("");
    }
}

int main( )
{
    char a[] = "ABCDFG";
    fun(a, strlen(a));
    puts(a);
    
    return 0;
}


[fly]存在即是合理[/fly]
2013-05-23 11:45
zhangshifeng
Rank: 2
等 级:论坛游民
帖 子:24
专家分:57
注 册:2013-5-19
收藏
得分:0 
c语言学习交流群:280768274
2013-05-23 14:46
hsjjgm
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:189
注 册:2013-4-27
收藏
得分:0 
#include<stdio.h>
#include<string.h>

void fun (char *w,int m)
{
    char s,*p1,*p2;
    p1=w;               //p1指向数组a
    p2=w+m-1;           
//    printf("%c\n",*p2);  输出结果是G,证明p2指向数组的最后一个元素

    if(p1<p2)
    {
        s=*p1++;                     这里的*p1++是怎么运作的?为什么是如下结果,哪位能解释下,谢谢
        printf("%c %c\n",*p1,*p2);   //B G   
        *p1=*p2--;
        printf("%c %c\n",*p1,*p2);  //G f
        *p2=s;
        printf("%c %c\n",*p1,*p2);  //G A
    }
}

void main()
{
    char a[]="ABCDfG";
    fun(a,strlen(a));
    puts(a);

}
/*
B G
G f
G A
AGCDAG
Press any key to continue
2013-05-23 15:42
快速回复:帮我分析一个小程序,自己不会呀!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016695 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved