专项练习:数组和字符串(一)

本文深入探讨了C语言中的各种编程技巧,包括程序输出、数据结构选择、指针操作、宏定义使用、函数特性及常见错误分析等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 程序输出的结果

#include<stdio.h>
int f (char x){
    return x*x%10;
}
main(){
    char a; 
    int b=0;
    for (a=0; a<5; a+=1){
        b =f(a);
        printf("%d",b);
    }
}

主函数中for循环,
a=0,满足条件a<5,执行循环体,b=0*0%10,输出b,a+=1;
a=1,满足条件a<5,执行循环体,b=1*1%10,输出b,a+=1;
a=2,满足条件a<5,执行循环体,b=2*2%10,输出b,a+=1;
a=3,满足条件a<5,执行循环体,b=3*3%10,输出b,a+=1;
a=4,满足条件a<5,执行循环体,b=4*4%10,输出b,a+=1;
a=5,不满足条件a<5,执行完。

2.假设要存储一个数据集,数据维持有序,对其的操作只有插入、删除和顺序遍历,综合存储效率和运行速度,下列哪种数据结构是最适合的是?

链表

3.下面有关空指针和未初始化指针,说法错误的是?

A.对0x0这个地址取值是非法的。
正确

B.空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。
正确

C.空指针与任何对象或函数的指针值都不相等。
正确

D.mallc在其内存分配失败时返回的是一个未初始化的指针
错误,mallc分配内存失败时返回的是空指针。

4.程序的输出结果

main()
{
    int x;
    scanf(“ % d”, &x);
    if (x-- < 5) printf(“ % d”, x);
    else printf(“ % d”, x++);
}

程序运行后,如果从键盘上输入5,则输出结果是 :4

条件x–<5中,先进行x<5的判断,再进行x–运算;(不是只有x<5为真时才x–)
输入5后,判断,5不满足x<5的判断条件,x–后,x=4;
进行else后面语句,由于输出变量是x++,先输出x,x=4,再进行x++,此时x=5;
若输出语句换成++x,就先进行++x,再输出x。

5.程序输出的是

#define add(a,b) a+b
int main()
{
    printf(“ % d\n”, 5 * add(3, 4));
    return 0;
}
#define add(a,b) a+b

即在程序中出现add(a,b)的地方全用a+b代替,只是简单替换;(重在理解简单替换)
程序中出现 5 * add(3, 4),通过替换变为 5* 3+4,即为19。

6.说法正确的是

A 一个空类默认一定生成构造函数,拷贝构造函数,赋值操作符,引用操作符,析构函数。
争议:
空类中有六个默认的成员函数: 1:构造函数 2:拷贝构造函数 3:析构函数 4:=运算符重载函数 5:取址运算符重载 6:const修饰的取址运算符重载(并返回const指针)

B 可以有多个析构函数。
错误:一个类只能有一个析构函数

C 析构函数可以为virtual,可以被重载。
错误:析构函数没有参数列表,无法重载,但是可以重写 。

D 类的构造函数如果都不是public访问属性,则类的实例无法创建。
错误:单例模式下,成员函数私有可以实例化。

7.程序的输出

int FindSubString( char* pch )
{
    int   count  = 0;
    char  * p1   = pch;
    while ( *p1 != '\0' )
    {    
        if ( *p1 == p1[1] - 1 )
        {
            p1++;
            count++;
        }else  {
            break;
        }
    }
    int count2 = count;
    while ( *p1 != '\0' )
    {
        if ( *p1 == p1[1] + 1 )
        {
            p1++;
            count2--;
        }else  {
            break;
        }
    }
    if ( count2 == 0 )
        return(count);
    return(0);
}
void ModifyString( char* pText )
{
    char  * p1   = pText;
    char  * p2   = p1;
    while ( *p1 != '\0' )
    {
        int count = FindSubString( p1 );
        if ( count > 0 )
        {
            *p2++ = *p1;
            sprintf( p2, "%i", count );
            while ( *p2 != '\0' )
            {
                p2++;
            }
            p1 += count + count + 1;
        }else  {
            *p2++ = *p1++;
        }
    }
}
void main( void )
{
    char text[32] = "XYBCDCBABABA";
    ModifyString( text );
    printf( text );
}  

FindSubString函数功能:
指针p1后字母上升(每次加1)的次数和字母下降(每次减1)的次数相同,则return(count),否则return 0;

text[32] = “XYBCDCBABABA”,p1指向X,X后面元素只升一次,没有降则return 0;指针向后移动,
p1指向Y,Y后面元素没有升则return 0;*p2++ = *p1++;指针向后移动,
p1指向B,B后面元素升两次降三次,则return 0;*p2++ = *p1++;指针向后移动,
p1指向C,C后面元素升一次降三次,则return 0;*p2++ = *p1++;指针向后移动,
p1指向D,D后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向C,C后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向B,B后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向A,A后面元素升一次降一次,count=1,则return (count);

进入ModifyString函数:
count =1,
此时p1指向第一个A,经过*p2++ = *p1,p2指向第一个A后面的B;
sprintf( p2, “%i”, count );语句是将count转化为字符串(带’\0’),即将p2指向的B用1代替,并将’\0’添加到1的后面;
while ( *p2 != ‘\0’ ){p2++;}语句执行完,此时p2指向第二个A的位置;
p1 += count + count + 1;后,p1指向第二个A后面的B的位置;
此时,在函数ModifyString继续执行 while ( *p1 != ‘\0’ )的循环体,这之后没有对称回文子串,则执行*p2++=*p1++,直到p1到达串尾,即用倒数第二个字符替换倒数第三个,用倒数第一个字符替换倒数第二个,即B换A,A换A。
最后输出为 :XYBCDCBA1BAA

8.char (*p)[16]

p是指向长度为16的字符数组的指针

9.内联函数,说法正确的是:

A 一般用于加快程序执行速度
B 可能减小可执行文件大小
C 可能增加可执行文件大小

10.程序哪有问题

class CBuffer
{
    char * m_pBuffer;
    int m_size;
    public:
        CBuffer()
        {
            m_pBuffer=NULL;
        }
        ~CBuffer()
        {
            Free();
        }
        void Allocte(int size) (1) {
            m_size=size;
            m_pBuffer= new char[size];
    }
    private:
        void Free()
        {
            if(m_pBuffer!=NULL) (2)
            {
                delete[] m_pBuffer; 
                m_pBuffer=NULL;
            }
        }
    public:
        void SaveString(const char* pText) const (3)
        {
            strcpy(m_pBuffer, pText); (4)
        }
        char* GetBuffer() const
        {
            return m_pBuffer;

    }

    };

void main (int argc, char* argv[])
{
    CBuffer buffer1;
    buffer1.SaveString("Microsoft");
    printf(buffer1.GetBuffer());
}

1 3 4 有问题。
1 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;
3 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;
4 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值