12.9练习。

题目如下。结果均通过编译(dev)

1、:(1)分析程序, 写出输出结果?
/*  char *ptr; 
    if ((ptr = (char *)malloc(0)) == NULL) 
    puts("Got a null pointer"); 
    else 
    puts("Got a valid pointer"); 
*/

    //申请时,会返回一个有效的指针。这个可以通过 linux 的man手册查询malloc的使用方法。当使用malloc申请一个空间大小为0的空间的时候,编译器会返回一个默认的最小空间,空间的大小看编译器的默认设置。

    (2) 分析程序, 写出输出结果?
/*char * GetStr()
    {
        char *tmp;
        tmp = "123"
        return tmp;
    }
    void main()
    {
        printf("%s.\n", GetStr());
    }
*/
    //编译器在使用完函数之后会释放函数的内存,让函数里边定义的一个指针成为野指针,所以即使你可以使用此方法调用成功并打印出‘123’,还是放弃这种形式的使用。尽量在main函数中使用字符串,或者函数中使用malloc申请空间(函数结束后不会被释放)。


2、输入一个正整数,输出原数并逆序打印出各位数字。
//例如:原数:123456 逆序:654321
//逆序函数原型:int invers_int(int x)(需要用到递归实现)

#include <stdio.h>
#include <string.h>
#define max 100
char* invers_int(char *x)
{
    int i = 0;
    char change;
    int len = strlen(x)-1;
    for(i=0; i<len/2; i++)
    {
        change = x[i];
        x[i] = x[len-i];
        x[len-i] = change;//感觉使用字符串比起整数方便很多。将字符串首尾交换可以得到最后的结果。
    }
    return x;
}
int main(void)
{
    char s[max];
    printf("enter a number !\n");
    scanf("%s", s);
    printf("x = %s.\n", invers_int(s));
    return 0;
}

//下面来一个非字符串的形式。主要是因为用整形表达的数的范围实在是特别小。
#include <stdio.h>
#include <string.h>
#define max 100
int invers_int(int x)
{
    int l = 0, s = 0;
    l = x;
    while(l)
    {
        s = s*10 + l%10;
        l = l / 10;
    }
    return s;
}
int main(void)
{
    int s;
    printf("enter a number !\n");
    scanf("%d", &s);
    printf("x = %d.\n", invers_int(s));
    return 0;
}

3、按以下规律翻译密码:将每一个字母变成它后面的字母,例如,将A变成B,B变成C,…,Z变成A,非字母字符不变,“!”作为电文结束标志。
#include <stdio.h>
#include <string.h>
#define max 100
void change(char *s)
{
    int i = 0;
    int len = strlen(s) ;

    for(i=0; i<len; i++)
    {
        if((s[i] >= 'a' && s[i] <= 'y' ) || (s[i] >= 'A' && s[i] <= 'Y' ))//根据题意添加控制条件
            s[i] = s[i] + 1;
        else if(s[i] == 'z' || s[i] == 'Z')//将小z和大z单独分出。比较独特,减去与小a和大a的差距。
            s[i] = s[i] - 25;
    }
}
int main(void)
{
    char s[max];
    int i = 0;
    for(i=0; i<max; i++)
    {
        scanf("%c", &s[i]); //一个一个输入输入到!时结束输入
        if(s[i] == '!')
            break;
    }
    s[i] = '\0';// 在!号后面添加结束标志。
    change(s);//调用加密函数
    printf("s = %s.\n", s);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值