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编程指南》
//写出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));
}