12.9练习。

来源:互联网 发布:单片机控制方案 编辑:程序博客网 时间:2024/06/01 22:07

题目如下。结果均通过编译(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 100char* 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 100int 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 100void 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;}