C语言练习题(5)

时间:2022-02-12 11:38:29

1、
int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位, n为需要转换的长度,假设起始点在右边.
如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001。

int intvert(unsigned int x, int p, int n)
{
    unsigned int m = 0;
    unsigned int a = 1;
    int i = 0;
    for (i = 0; i < n; i++)//生成n个1
    {
        m |= a;
        a = a << 1;
    }

    m = m << p;//位移p位
    x ^= m;

    printf("x=0x%x\n", x);

    return 0;
}

2、已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析怎样获取WAV格式的各项信息。
C语言练习题(5)

思路:使用fopen函数打开wav文件,编写struct,其中定义头文件各类型参数及大小,使用fread函数按struct大小读取文件内容。

//伪代码
struct WAVHead
{
    char RIFF;
    ...
}MyStruct;

FILE *p = fopen("xxx.wav", "r");
int n = fread(&MyStruct, sizeof(WAVHead), 1, p);

3、
下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位是1)中的大写字母转化为小写字母,找出其中的bug。
for (char *piterator=sz_word; *piterator!=0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator>=’A’ && *piterator<=’Z’)
piterator +=32;
}

for (char *piterator=sz_word; *piterator!=0; piterator++)

{

    if ((*piterator) & 0x80 != 0)//*和&相同优先级,应加括号

    {

        piterator++;

    }

    else if(*piterator >='A' && *piterator<='Z')

        *piterator += 32;//更改指针的内容,而不是指针本身
}