西邮linux 兴趣小组纳新题2021

1.

int main(int argc , char *argv[]) 
{ 
    unsigned char a = 255; 
    char ch = 128;  
    a -= ch;  
    printf("a = %d ch = %d\n", a, ch);
}

考察点:数据的范围与溢出

知识点:所有数据在计算机内的存储模式均为二进制,char类型说占空间为一个字节,共八个bit位。unsigned为无符号整形,在char中的范围为1~255。若不加unsigned则char的范围为-128~127

答案:127 -128

原因:

输出1:在与a进行计算时,ch被强制转换为了无符号类型与a进行运算,相减的结果为127。

输出2:对于char类型的变量当赋予它的值大于他的范围时便会发生数据的溢出。越过127后即为-128

2.

int main(int argc, char *argv[]) 
{  
    char *str = "Xi You Linux Group 20"; 
    printf("%d\n", printf(str)); 
    return 0;
}

考察点:printf函数的返回值与嵌套时函数调用的顺序

知识点:详见2022年纳新题解

答案:Xi You Linux Group 2021

原因:最先调用里层函数打印出字符串,在调用外层函数打印出里层函数的返回值即为21

3.

#include <stdio.h>
int i=2;
void func(){
    if(i!=0){
        static int m=0;
        int n=0;
        n++;
        m++;
        printf ("%d %d ",m,n);
        i--;
        func();
    }else{
        return ;
    }
}
int main()
{
    func ();
    return 0;
}

考察点:对于全局变量与局部变量的理解与应用

知识点:详见纳新题解2022与2021两篇文章

答案:1 1 2 1

原因:i为全局变量,因递归的条件为i不等于0,所以共调用函数两次。第一次调用时n与m自增。但因为n为静态变量,它在函数第一次被调用后他的值被保存了下来,因此此后每一次调用函数n的值都不会被改变。

4.

#include <stdio.h>
int main()
{
    char ch ='A';
    int i=65;
    unsigned int f=3354433;//f=0000 0010 0000 0000 0000 0000 0000 0001

    *(int *)&f>>=24;//将f右移24为变为0000 0000 0000 0000 0000 0000 0000 0010 即为十进制中的2
    *(int *)&f = *(int *)&f+'?';//?为63
    printf ("%c %c %c",ch,i,*(int *)&f);
}

考察点:ascii码的应用

答案:A A A

原因:%c为字符类型的占位符,输出即为字符A,在ascii码中65对应的便是字符A。f为

6.

#include <stdio.h>
int* get_array(){
    int array[1121];
    for(int i=0;i<sizeof(array)/sizeof(int);i++){
        array[i]=i;
    }
}
int main()
{
    int *p = get_array();
}

考察点:当函数返回类型为指针时的注意事项

知识点:函数在栈区由程序自行调配,当这此函数被调配之后该空间便被释放。若将指针定义在函数中,则在前一个函数调配完之后该函数的位置便会发生改变,返回的地址便会出现错误

答案:给数组array赋值

问题的解决:在堆区动态申请内存

7.

#include<stdio.h>
#include<string.h>
int main()
{
    char str[]="xiyoulinuxgroup";
    char *p=str;
    char x[]="xiyoulinuxgroup\t\106F\bamily";
    printf("%zu %zu %zu %zu\n",sizeof(str),sizeof(p),sizeof(x),strlen(x));
}

考察点:sizeof与srtlen的用法

答案:16 8 25 24

原因:

第一个字符串中有15个字符加上自动补全的\0共占有16个字节

指针类型在不同的架构下为4/8字节

\t代表一个tab,为四个空格差四个字节

srtlen计算长度是不会算入最后一个/0

8.

#include<stdio.h>
int add(int *x,int y){
    return *x=(*x^y)+((*x&y)<<1);
}
int a;//定义全局变量可在整个程序中访问
int main()
{
    int b=2020;
    if(add(&b,1)||add(&a,1)){
        printf("xiyoulinuxgroup%d\n",b);
        printf("wating for y%du\n!",a);
    }
    if(add(&b,1)&&a++){
        printf("xiyoulinuxgroup%d\n",b);
        printf("wating for y%du\n!",a);
    }//a++并未发生,不执行该语句中的内容
}

考察点:

位运算

全局变量

知识点:详见2022纳新与2021纳新两篇文章

答案:

xiyoulinuxgroup2021
wating for y0u

详细运算过程便不在此叙述

9.

void func() 
{   
    int a = 2020; 
    unsigned long c;  
    printf("%p\n", &a); 
    printf("我们想要修改的地址:");
    scanf("%lx", &c); 
    printf("请随便输入一个数字:"); 
    scanf("%d", (int *)c); //把c的地址里面存的值以int类型来解释,即将这个数字放到c地址中
    printf("a = %d\n", a);
}
//最终会输出随机输入的那个数字

10.

详见2021年纳新第14题

11.

puts(
    (char*)(int const[])
     {0X6F796958,0X6E694C75,0X72477875,0X3270756F,0X313230,0X00000A}
);//打印XiyouLinuxGroup2021
//大小端问题,详见2022纳新第12题

12.

int main(int argc, char *argv[]) 
{ 
    char str[1121];  
    int key;
    char t;  
    fgets(str, 1121, stdin);  
    for(int i = 0; i < strlen(str) - 1; i++) 
    {   
        key = i;  
        for(int j = i + 1; j < strlen(str);j++) 
        {      
            if(str[key] > str[j]) 
            {      
                key = j;   
            }   
        }    
        t = str[key];  
        str[key] = str[i]; 
        str[i] = t; 
    } 
    puts(str); 
    return 0;
}

利用ascii码对字符大小进行简单的选择排序

13. 

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    printf("%d",fib(n));
}
int fib(int n)
{
    if(n<=2){
        return 1;
    }else{
        return fib(n-1)+fib(n-2);
    }
}//递归写法
#include<stdio.h>
int main()
{
    int a=0,b=0,c=1,n;//a表示下一项,b表示上一项,c表示这一项
    scanf("%d",&n);
    while(n>0){
        a=b+c;//求出下一项的值
        b=c;//将这一项的值给上一项
        c=a;//将下一项的值给这一项
        n--;
    }
    printf ("%d",a);
}

14.

mkdir [选项] [目录名称] 创建目录
touch创建文件或者修改文件的时间属性
ls-l显示一个文件的属性以及文件所属的用户和组
ls*.Linux查看文件数量
rmdir删除子目录
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值