C笔试题练习

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 <stdio.h>
#include <string.h>

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 <stdio.h>
#include <string.h>

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<stdio.h>

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.写出floatboolint类型与零的比较,假设变量为X

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


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

#include <stdio.h>

#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 <stdio.h>
/* 这里需要明确指定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));
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值