暑假第十天之每天一些题系列

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第十天之每天一些题系列相关的知识,希望对你有一定的参考价值。

暑假第十天之每天一些题系列

一、选择题

  • 关于如下代码,说法错误的是
char acX[] = "abc";
char acY[] = {'a','b','c'};
char *szX = "abc";
char *szY = "abc";

A. acX 与 acY 的内容可以修改
B. szX 与 szY 指向相同的地址
C. acX 占用的内存空间比 acY 占用的大
D. szX 的内容修改后, szY 的内容也会被更改

答案解析:

A :acX和acY都是数组,当然可以修改 B:因为"abc"是常量字符串,当它被多次使用时,编译器并不愿意再多分配出额外的内存空间存放多个"abc",而是重复使用这一个"abc",所以,szX和szY指针会指向同一个地址。 C:因为acX是字符串数组,字符串的尾部有一个结束符’\\0’,所以acX有四个元素,内存空间比acY大 D:字符指针指向的是常量字符串,常量字符串不能修改

  • 运行以下 C 语言代码,输出的结果是____
int main()
{
    char *str[3] = {"stra","strb","strc"};
    char *p = str[0];
    int i = 0;
    while(i < 3)
    {
        printf("%s ",p++);
        i++;
    }
    return 0;
}

A. stra strb strc B. stra tra ra C. s s s D. s t r

答案解析:

str是一个指针数组,p是一个字符指针,指向str[0],i=0时,打印p++,先使用后加加,p的值为str[0],p存的是字符串首字符s的地址,以字符串形式打印,即stra;当i=1时,p此时指向stra中的t,以字符串形式打印,即tra;当i=2时,p此时指向stra中的r,以字符串形式打印,即:ra,故答案为B

  • *设 int x[] = {1,2,3,4,5,6},p=x; 则值为 3 的表达式是____

    A. p+=2,*++p B. p+=2,*p++ C. p+=3,*p D. p+=2,++*p

答案解析:

++的优先级高于解引用,p指向数组x的首元素地址,A:p=p+2,让p指向第三个元素,先++p然后解引用,得到的结果是4;B:p=p+2,让p指向第三个元素,先p++再解引用,得到的结果为3;C:p+=3,让p指向第四个元素,*\\p得到的结果为4,D:p+=2,让p指向第三个元素,*p得到3,再前置++,得到的是4。

  • 代码 int *(*ptr)() ,则以下叙述中正确的是____

    A. ptr 是指向一维数组的指针变量
    B. ptr 是指向int型数据的指针变量
    C. ptr 是指向函数的指针,该函数返回一个int型数据
    D. ptr 是指向函数的指针,该函数的返回值是指向int型数据的指针

    答案解析:

首先ptr是一个指针,指向的是一个函数,函数的参数为空,函数的返回类型为int*,即ptr 是指向函数的指针,该函数的返回值是指向int型数据的指针

  • 以下关于指针的说法,正确的是

    A. int *const p 与 int const *p 等价
    B. const int *p 与 int *const p 等价
    C. const int *p 与 int const *p 等价
    D. int *p[10] 与 int (*p)[10] 等价

答案解析:

**int const p ,const修饰的是p,即p的指向不能改变,而 int const *p和const int *p ,const修饰的都是*p,即p所指向空间的内容是不能改变的,而int p[10]是指针数组,int (*p)[10]是数组指针。

二、填空题

  • 如下代码输出结果是什么
#include<stdio.h>
char *myString()
{
    char buffer[6] = {0};
    char *s = "Hello World!";
    for (int i = 0; i < sizeof(buffer) - 1; i++)
    {
   		buffer[i] = *(s + i);
    }
    return buffer;
}
int main()
{
    printf("%s\\n", myString());
    return 0;
}

答案解析:

首先sizeof(buffer)是6,故for循环进行5次,最后将Hello赋进buffer中,然后将buffer返回,我们这里需要注意的是,buffer它是局部变量,在函数调用结束后就会销毁,而我们这里将地址返回,显示是不行的,因为buffer已经还给操作系统了,故这里打印的是随机的。

  • 下面的代码输出什么
#include <stdio.h>
int main()
{
    int i = 1;
    printf("%d, %d\\n", sizeof(i++), i);
    return 0;
}

答案解析:

这里打印的是,4,1,为什么呢?sizeof操作符里面的表达式是不参与运算的,他只看最后决定表达式的变量类型是什么,这里i是int类型,故打印4,没有进行运算,故i还是1。

  • 下面代码输出什么

    int main()
    {
        char a[1000];
        int i;
        for(i=0; i<1000; i++)
        {
        	a[i] = (char)(-1 - i);
        }
        printf("%d\\n", strlen(a));
        return 0;
    }
    

答案解析:

strlen的结束标志为\\0,有符号的char的取值范围为-128~127,当i=128时,-1-128是-129,-129的原码为:10000000 00000000 00000000 10000001

补码为:11111111 11111111 11111111 01111111

将它转化为char,即截断后为:01111111,它的原码也是这个,故为127

当i=129时,-1-129是-130,-130的原码是:10000000 00000000 00000000 10000010

补码为:11111111 11111111 11111111 01111110

将它转化为char,即截断后为:01111110,它为126,

以此类推,我们一直

当i=255时,-1-255是-256,-256的原码是:10000000 00000000 00000001 00000000

补码为:11111111 11111111 11111111 00000000

将它转化为char,即截断后为:00000000,它为0,即这里成为了strlen计算字符串长度的结束标志地方。

故最后打印的为255。

三、算法题

题目描述:

在字符串中找出第一个只出现一次的字符。如输入 “abaccdeff” ,则输出 ‘b’ 。

思路1:

依次遍历数组,并进行计每个字符出现的次数,新创建一个数组,用来存放这些次数,然后遍历新数组,第一个为1的对应下标就是原数组中第一次出现一次的字符的下标

代码如下:

#include<stdio.h>
void FindNum(char arr[], int len)
{
    int arr1[20] = { 0 };
    int i = 0;
    int j = 0;
    int count = 0;
    for (i = 0; i < len; i++)
    {
        count = 0;
        for (j = 0; j < len; j++)
        {
            if (arr[i] == arr[j])
            {
                count++;
            }
        }
        arr1[i] = count;
    }
    for (i = 0; i < len; i++)
    {
        if (arr1[i] == 1)
        {
            printf("第一次出现的字符是:%c\\n", arr[i]);
            return;
        }
    }
    printf("没有出现一次的字符\\n");
}

int main()
{
    char arr[] = "abaccdeff";
    int len = sizeof(arr) / sizeof(arr[0]);
    FindNum(arr, len);
    return 0;
}

该算法的时间复杂度为O(n^2),算法时间复杂度较高

思路2:

和上面思路一样,新创建一个数组,用来存放这些次数,然后遍历字符串,第一个为1的对应下标就是原数组中第一次出现一次的字符的下标,但是这次我们的存放字符出现次数的方式不一样,是根据ascii码值作为数组下标存放的

#include<stdio.h>
void FindNum(char *str)
{
    int count[256] = { 0 };//
    char *p = str;
    while(*p)
    {
        count[*p++]++;//设置每个字符出现的次数
    }
    while(*str)
    {
        if(count[*str]==1)
        {
            printf("第一次出现的字符是:%c\\n",*str);
            return;
        }
        str++;
    }
    printf("没有出现一次的字符\\n");
}

int main()
{
    char arr[] = "abaccdeff";
    int len = sizeof(arr) / sizeof(arr[0]);
    FindNum(arr);
    return 0;
}

该算法时间复杂度为O(n)

以上是关于暑假第十天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章

暑假第四天之每天一些题系列

暑假第一天之每天一些题系列

暑假第二天之每天一些题系列

暑假第九天之每天一些题系列

暑假第三天之每天一些题系列

暑假第十一天之每天一些题系列