| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2301 人关注过本帖
标题:请教高手用指针解此题!
只看楼主 加入收藏
miaowangjian
Rank: 2
等 级:论坛游民
帖 子:34
专家分:30
注 册:2010-1-29
收藏
得分:5 
#include "stdio.h"
//将整型num转换为字符窜,放在s字符指针的前面
//例如 num = 1234,char array [0][1][2][3][4][5][6][7];
//s指向[7],则:char array [0][1][2][3][4]=1[5]=2[6]=3[7]=4;
int int_to_string(char *s,unsigned int num)
{
    int i = 0;//统计有多少位
    do
    {
        *s = num % 10 + '0';//将最低位数转换为字符
        num /= 10;//去掉最低位
        s--;
        i++;
    }while(num);
    return i;
}

int main ()
{
    int ming_len;//名 字符串的长度
    int xing_len;//姓 字符串的程度
    char *ming,*xing, *temp;
   
    printf("name=");
    scanf("%s",temp);
    ming_len = strlen(temp);//获得 名 字符串的长度
    ming = (char *)malloc(ming_len);//为 名 字符串分配空间
    strcpy(ming,temp);//将 名 拷贝到申请的空间里
   
    printf("fname=");
    scanf("%s",temp);
    xing_len = strlen(temp);//获得 姓 字符串的长度
    xing = (char *)malloc(xing_len);//为 姓 字符串分配空间
    strcpy(xing,temp);//将 姓 拷贝到申请的空间里


   
    //为了简便,申请两个等于 名长度 + 空格 + 姓长度 大小的空间,然后想办法将数字填到相应的位置就可以了
    char *space_one,*space_two;
    space_one = (char *)malloc(ming_len+xing_len+2);
    space_two = (char *)malloc(ming_len+xing_len+2);
    memset(space_one, ' ',ming_len+xing_len+1);//使用空格填充
    space_one[ming_len+xing_len+1] = '\0';//设置字符结束符号
    strcpy(space_two,space_one);//让space_two也填充上空格,设置好结束符号
   
    //有可能 姓 或 名 字符串很长(超过1位数……),所以要记录有几位数(转换为字符的个数)
    int ming_len2str_len,xing_len2str_len;
    //数字转换为字符串,右对齐
    ming_len2str_len = int_to_string(&space_one[ming_len-1],ming_len);
    xing_len2str_len = int_to_string(&space_one[ming_len+xing_len],xing_len);
    printf("%s %s\n",ming,xing);//输出右对齐的版本
    printf("%s\n",space_one);
   
    //左对齐
    strncpy(&space_two[0],&space_one[ming_len-ming_len2str_len],ming_len2str_len);
    strncpy(&space_two[ming_len+1],&space_one[ming_len+xing_len-xing_len2str_len+1],xing_len2str_len);
    printf("%s %s\n",ming,xing);//输出左对齐的版本
    printf("%s\n",space_two);
    return 0 ;
}
2010-04-20 03:24
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:10 
徒弟(败给网络)  你看看这个吧
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void Function(char *Xing,char *Ming)
{
  printf("%s %s\n",Xing,Ming);                      /*以下几句利用了printf函数的功能,这里没有难度*/
  printf("%*d %*d\n",strlen(Xing),strlen(Xing),strlen(Ming),strlen(Ming));
  printf("%s %s\n",Xing,Ming);
  printf("%-*d %-*d\n",strlen(Xing),strlen(Xing),strlen(Ming),strlen(Ming));
}

void main()
{
  char *Xing,*Ming;
  Xing=(char *)malloc(10);    /*这里要注意 很多初学者使用指针时都忘记开辟空间
                                因为指针是用来保存地址的,如果不给它开辟空间就使用的话,
                                程序是不稳定的,是错误的。它类似于下面这样的地址分配:
                  ------
   堆栈指针 SP->  |Ming|  栈顶    刚定义变量时,它的值是随机的,所以如果不分配内存的话
                  |    |          它可能指向内存的任意地方,可能指向本进程内,也可能指向其他进程空间
                  |    | 4字节    所以这时我们给它赋值的话,比如gets(Ming),那么我们输入的字符串可能会
                  |    |          破坏其他内存当中的内容,这样是不稳定的,甚至有可能导致我们的程序崩溃
                  ------
                  |Xing|          假如Xing指针指向了我们在堆中分配的空间,这样通过指针Xing赋值的话,就正确了
                  |    | 4字节    假如输入给Xing的字符串是abc,那么这样这个字符串就正确保存起来了
                  |    |
                  |    |----     ------
                  ------   |---->| a  |     这里面保存我们分配的内存
                  |函数|         ------
                  |返回|         | b  |
                  |地址|         ------
                   ...           | c  |
                   堆栈段         ....
             (本图只是作为示意图,实际内存分配可能略有不同)*/
  Ming=(char *)malloc(10);
  gets(Xing);
  gets(Ming);
  Function(Xing,Ming);
  getch();
}

[ 本帖最后由 chengstone 于 2010-4-20 08:55 编辑 ]
收到的鲜花
  • 日的起烟烟2010-04-20 13:29 送鲜花  3朵   附言:好文章

qq:69558139
2010-04-20 08:52
mohao163
Rank: 5Rank: 5
来 自:南宁
等 级:职业侠客
威 望:2
帖 子:79
专家分:383
注 册:2009-9-25
收藏
得分:0 
版主讲的很透出啊,一般局部变量都放在栈里,而通过malloc函数申请分配的空间是放在堆里由程序员自己掌握的
2010-04-20 09:16
败给网络
Rank: 2
等 级:论坛游民
帖 子:45
专家分:63
注 册:2010-1-7
收藏
得分:0 
师傅谢谢你了···
2010-04-20 09:27
NOMIPS
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:86
专家分:537
注 册:2010-3-31
收藏
得分:5 
#include <stdio.h>
#include <string.h>
void printSpace(int n);

int main(int argc, char *argv[])
{
    int fnlong,lnlong;
    char *firstname=(char*)malloc(sizeof(char)*40);
    char *lastname=(char*)malloc(sizeof(char)*40);

    if((NULL==firstname)||(NULL==lastname))
    {
        printf("apply memory fail!\n");
        return 0;
    }

    printf("Input your name:");
    scanf("%s %s",firstname,lastname);
    fnlong=strlen(firstname);
    lnlong=strlen(lastname);
    printf("%s %s\n",firstname,lastname);
    printSpace(fnlong-1);
    printf("%d",fnlong);
    printSpace(lnlong);
    printf("%d",lnlong);
    printf("\n");

    printf("%s %s\n",firstname,lastname);
    printf("%d",fnlong);
    printSpace(fnlong);
    printf("%d",lnlong);
    printSpace(lnlong-1);
     printf("\n");

    printf("Hello, world\n");
    return 0;
}

void printSpace(int n)
{
        int i;
        for(i=0;i<n;i++)
            printf("%c",0x20);
}
2010-04-20 09:47
Ruzy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-4-10
收藏
得分:0 
谢谢各位大虾门,小弟受教了
2010-04-20 12:28
美苏争霸
Rank: 1
等 级:新手上路
帖 子:7
专家分:1
注 册:2010-4-3
收藏
得分:0 
路过····
2010-04-20 15:07
快速回复:请教高手用指针解此题!
数据加载中...
 
   



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

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