c语言红酒编程题,C笔试题练习 - linbo5411的个人空间 - OSCHINA - 中文开源技术交流社区...

1.

/******************************************

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。

比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:

void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 输入字符串

lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例

输入:“deefd” 输出:“def”

输入:“afafafaf” 输出:“af”

输入:“pppppppp” 输出:“p”

*******************************************/

#include

#include

void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

int main(void)

{

char str[] = "deefd";

char dest[strlen(str) + 1];

stringFilter(str, strlen(str), dest);

printf("before:%s after:%s\n", str, dest);

return 0;

}

void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)

{

int flag[26] = { 0 };

int i, j = 0;

for(i = 0; i < lInputLen; i++){

char tmp = pInputStr[i];

if(flag[tmp - 'a'] == 0){

pOutputStr[j++] = tmp;

flag[tmp - 'a'] = 1;

}

}

pOutputStr[j] = '\0';

}

2.

/****************************

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

压缩规则:

1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".

2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

要求实现函数:

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr: 输入字符串

lInputLen: 输入字符串长度

【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例

输入:“cccddecc” 输出:“3c2de2c”

输入:“adef” 输出:“adef”

输入:“pppppppp” 输出:“8p”

*************************************/

#include

#include

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)

{

int i, j = 0;

int num = 0;

int flag = 1;

for(i = 0; i < lInputLen; i++){

if( i && (pInputStr[i] != pInputStr[i-1]) ){

if(num > 1){

pOutputStr[j] = (char)num + '0';

j++;

}

pOutputStr[j++] = pInputStr[i-1];

num = 1;

}else

num++;

}

pOutputStr[j] = '\0';

if(strlen(pInputStr) == 1){

strcpy(pOutputStr, pInputStr);

}

}

int main(void)

{

char src[20] = "ppppuuuuabcd";

char dest[20];

//scanf("%s", src);

stringZip(src, 20, dest);

printf("src:%s\ndest:%s\n", src, dest);

return 0;

}

3.

小端模式(little-endian)的cpu对数据的存储是从低地址到高字节的,

大端模式(big-endian)模式操作数的存放方式是从高字节到低字节的。

一般的 x86数据存储是小端模式,arm是可选的,网络数据的存储是大端模式。

一种是设置一个数,检测该数数的高位或地位来判断,这是直接的方法:假设一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反

//C测试 大小端

//大端存储 0x1234 高地址存到高位,从高地址开始存储 0x12存到高地址 0x34低地址

//小端存储 底地址开始存储 0x12存到低地址 0x34高地址

#include

int main(void)

{

short int x;

char x0,x1;

x = 0x1234;

//默认为小端的话,0x12在高地址 0x34在低地址

x0 = ((char *) &x)[0]; //0x34

x1 = ((char *) &x)[1]; //0x12

if(x0 == 0x34)

{

printf("litter_endian\n");

}else

printf("big_endian\n");

return 0;

}

4.写出float,bool,int类型与零的比较,假设变量为X

摘自《林锐-高质量c++c编程指南》

43646a6aa2c7ea0b9867f7b4187046f0.png

cfca5f1cce15a223f367dd9355ca9205.png

//写出float,bool,int类型与零的比较,假设变量为X

#include

#define BOOL int

#define FALSE 0

#define TRUE 1

void compare_int(void)

{

int x;

if(x == 0){

printf("i am zero\n");

}else

printf("i am not zero (%d)\n", x);

}

void compare_bool(void) //c语言 没有bool类型 一般使用 #define BOOL int #define FALSE 0

{

BOOL x;

if(FALSE){

printf("i am zero\n");

}else

printf("i am not zero\n");

}

void compare_float(void)

{

float x; //float 精度为6-7

if( (x > -0.000001) && (x < 0.000001) ){

printf("i am zero\n");

}else

printf("i am not zero (%f)\n", x);

}

int main(void)

{

compare_int();

compare_bool();

compare_float();

return 0;

}

/*

i am not zero (-1219146155)

i am not zero

i am not zero (-0.000013)

*/

5.

C语言 extern

在头文件中声明函数时,前面的extern可有可无,只要这些函数曾在某个.c文件中实现就行了,

不过一些函数没有在所包含的头文件中给出声明,同时函数的定义位于其它文件中,这时候使用

该函数的.c文件必须用extern标记该函数为外部函数。举个例子:

/* c.h */

extern int max(int a, int b);

extern int min(int a, int b);

/* a.c */

#include

/* 这里需要明确指定output为extern函数 */

extern void output();

int max(int a, int b)

{

return (a > b ? a : b);

}

int min(int a, int b)

{

return (a < b ? a : b);

}

void main()

{

output();

}

/* b.c */

#include "c.h"

void output()

{

printf("%d %d\n", max(10, 5), min(10, 5));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值