首先就是memcpy
表头文件: #include
定义函数: void *memcpy(void *dest, const void *src, size_t
n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
返回值:
返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠
例如:
你需要复制串str=“wangyucao1989”中的“yucao”,那么可以这么写:
memcpy(newstr,str+4,5);
除了memcpy之外,string还提供了strncpy函数:
函数名称: strncpy
函数原型: char *strncpy(char *dest, const char
*src,int
count)
函数功能: 将字符串src中的count个字符拷贝到字符串dest中去
函数返回: 指向dest的指针
参数说明: dest-目的字符串,src-源字符串,count-拷贝的字符个数
所属文档:
还是上面的例子,这个程序可以这样写:
#include
#include
int main()
{
char
str[] = "wangyucao1989";
char
newstr[6];
//memcpy(newstr,str+4,5);
strncpy(newstr,str+4,5);
newstr[5] = '\0';
printf("%s\n",newstr);
return 0;
}
========================================================
位运算:
运算方法有六种:
& 与运算
| 或运算
^ 异或运算
~ 非运算(求补)
>> 右移运算
<< 左移运算
运用这些基本的运算,我们可以解决acm所需的各种运算,给Bit赋1,赋0,给他的值取反,还有好多段操作。如下:
功能
|
示例
| 位运算
-----------------+---------------------+--------------------
去掉最后一位
| (101101->10110) | x
>> 1
在最后加一个0 |
(101101->1011010) | x < < 1
在最后加一个1 |
(101101->1011011) | x < < 1+1
把最后一位变成1 |
(101100->101101) | x | 1
把最后一位变成0 |
(101101->101100) | x | 1-1
最后一位取反
| (101101->101100) | x ^ 1
把右数第k位变成1 |
(101001->101101,k=3) | x | (1 < < (k-1))
把右数第k位变成0 |
(101101->101001,k=3) | x & ~ (1 < <
(k-1))
右数第k位取反 |
(101001->101101,k=3) | x ^ (1 <
< (k-1))
取末三位
|
(1101101->101)
| x & 7
取末k位
| (1101101->1101,k=5) | x & ((1 < <
k)-1)
取右数第k位
|
(1101101->1,k=4)
| x >> (k-1) & 1
把末k位变成1
| (101001->101111,k=4) | x | (1 <
< k-1)
末k位取反
| (101001->100110,k=4) | x ^ (1 <
< k-1)
把右边连续的1变成0 |
(100101111->100100000) | x & (x+1)
把右起第一个0变成1 |
(100101111->100111111) | x | (x+1)
把右边连续的0变成1 |
(11011000->11011111) | x |
(x-1)
取右边连续的1
|
(100101111->1111)
| (x ^ (x+1)) >> 1
去掉右起第一个1的左边 |
(100101000->1000) | x &
(x ^ (x-1))
判断奇数
(x&1)==1
判断偶数
(x&1)==0
取右边第一个1所在位置 x&-x
================================================================
类型转换:
函数名: abs 功 能: 求整数的绝对值
用 法: int abs(int i);
程序例:
#include
#include
int main(void)
{
int number = -1234;
printf("number:
%d absolute value: %d\n", number,
abs(number));
return 0;
}
函数名: atof
功 能: 把字符串转换成浮点数
用 法: double atof(const char *nptr);
程序例:
#include
#include
int main(void)
{
float
f;
char *str =
"12345.67";
f =
atof(str);
printf("string = %s float = %f\n", str, f);
return
0;
}
函数名: atoi
功 能: 把字符串转换成长整型数
用 法: int atoi(const char *nptr);
程序例:
#include
#include
int main(void)
{
int
n;
char *str =
"12345.67";
n =
atoi(str);
printf("string = %s integer = %d\n", str, n);
return
0;
}
函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr);
程序例:
#include
#include
int main(void)
{
long
l;
char *str =
"98765432";
l =
atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
===========================================================
其他函数:
函数名: bsearch
功 能: 二分法搜索
用 法: void *bsearch(const void *key, const void *base,
size_t *nelem, size_t width, int(*fcmp)(const
void *, const *));
程序例:
#include
#include
#define NELEMS(arr) (sizeof(arr) /
sizeof(arr[0]))
int numarray[] = {123, 145, 512, 627, 800,
933};
int numeric (const int *p1, const int
*p2)
{
return(*p1 -
*p2);
}
int lookup(int key)
{
int
*itemptr;
itemptr =
bsearch (&key, numarray, NELEMS(numarray),
sizeof(int), (int(*)(const void *,const void
*))numeric);
return
(itemptr != NULL);
}
int main(void)
{
if
(lookup(512))
printf("512 is in the table.\n");
else
printf("512 isn't in the table.\n");
return
0;
}
函数名: fabs
功 能: 返回浮点数的绝对值
用 法: double fabs(double x);
程序例:
#include
#include
int main(void)
{
float number = -1234.0;
printf("number: %f absolute value:
%f\n",
number,
fabs(number));
return
0;
}
函数名: fcvt
功 能: 把一个浮点数转换为字符串
用 法: char *fcvt(double value, int ndigit, int *decpt,
int *sign);
程序例:
#include
#include
#include
int main(void)
{
char
*string;
double
value;
int dec,
sign;
int ndig =
10;
clrscr();
value =
9.876;
string =
ecvt(value, ndig, &dec, &sign);
printf("string =
%s
dec = %d \
sign = %d\n", string, dec, sign);
value =
-123.45;
ndig=
15;
string =
ecvt(value,ndig,&dec,&sign);
printf("string = %s dec = %d sign = %d\n",
string, dec, sign);
value =
0.6789e5;
ndig =
5;
string =
ecvt(value,ndig,&dec,&sign);
printf("string =
%s
dec = %d\
sign = %d\n", string, dec, sign);
return
0;
}
函数名: gcvt
功 能: 把浮点数转换成字符串
用 法: char *gcvt(double value, int ndigit, char
*buf);
程序例:
#include
#include
int main(void)
{
char
str[25];
double
num;
int sig =
5;
num =
9.876;
gcvt(num,
sig, str);
printf("string = %s\n", str);
num =
-123.4567;
gcvt(num,
sig, str);
printf("string = %s\n", str);
num =
0.678e5;
gcvt(num,
sig, str);
printf("string = %s\n", str);
return(0);
}
函数名: itoa
功 能: 把一整数转换为字符串
用 法: char *itoa(int value, char *string, int
radix);
程序例:
#include
#include
int main(void)
{
int number =
12345;
char
string[25];
itoa(number,
string, 10);
printf("integer = %d string = %s\n", number, string);
return
0;
}
函数名: labs
功 能: 取长整型绝对值
用 法: long labs(long n);
程序例:
#include
#include
int main(void)
{
long
result;
long x =
-12345678L;
result=
labs(x);
printf("number: %ld abs value: %ld\n",
x, result);
return
0;
}
函数名: memcpy
功 能: 从源source中拷贝n个字节到目标destin中
用 法: void *memcpy(void *destin, void *source,
unsigned n);
程序例:
#include
#include
int main(void)
{
char src[] =
"******************************";
char dest[] =
"abcdefghijlkmnopqrstuvwxyz0123456709";
char
*ptr;
printf("destination before memcpy: %s\n", dest);
ptr =
memcpy(dest, src, strlen(src));
if
(ptr)
printf("destination after memcpy: %s\n",
dest);
else
printf("memcpy failed\n");
return
0;
}
函数名: memset
功 能: 设置s中的所有字节为ch,
s数组的大小由n给定
用 法: void *memset(void *s, char ch, unsigned
n);
程序例:
#include
#include
#include
int main(void)
{
char buffer[]
= "Hello world\n";
printf("Buffer before memset: %s\n", buffer);
memset(buffer, '*', strlen(buffer) - 1);
printf("Buffer after memset: %s\n",
buffer);
return
0;
}
函数名: pow 功 能: 指数函数(x的y次方)
用 法: double pow(double x, double
y);
程序例:
#include
#include
int main(void)
{
double x =
2.0, y = 3.0;
printf("%lf
raised to %lf is %lf\n", x, y, pow(x, y));
return
0;
}
函数名: qsort
功 能: 使用快速排序例程进行排序
用 法: void qsort(void *base, int nelem, int width, int
(*fcmp)());
程序例:
#include
#include
#include
int sort_function( const void *a, const void
*b);
char list[5][4] = { "cat", "car", "cab", "cap",
"can" };
int main(void)
{
int x;
qsort((void
*)list, 5, sizeof(list[0]), sort_function);
for (x = 0; x
< 5; x++)
printf("%s\n", list[x]);
return
0;
}
int sort_function( const void *a, const void
*b)
{
return(
strcmp(a,b) );
}
函数名: sqrt
功 能: 计算平方根
用 法: double sqrt(double x);
程序例:
#include
#include
int main(void)
{
double x = 4.0, result;
result = sqrt(x);
printf("The square root of %lf is %lf\n", x, result);
return 0;
}
========================================================
字符串函数:
函数名: sscanf
功 能: 执行从字符串中的格式化输入
用 法: int sscanf(char *string, char
*format[,argument,...]);
程序例:
#include
#include
int main(void)
{
char
label[20];
char
name[20];
int entries =
0;
int loop,
age;
double
salary;
struct
Entry_struct
{
char name[20];
int age;
float salary;
}
entry[20];
printf("\n\nPlease enter a label for the chart: ");
scanf(" s",
label);
fflush(stdin);
printf("How
many entries will there be? (less than 20) ");
scanf("%d",
&entries);
fflush(stdin);
for
(loop=0;loop
{
printf("Entry %d\n", loop);
printf(" Name
: ");
scanf("%[A-Za-z]", entry[loop].name);
fflush(stdin);
printf("
Age :
");
scanf("%d", &entry[loop].age);
fflush(stdin);
printf(" Salary : ");
scanf("%f", &entry[loop].salary);
fflush(stdin);
}
printf("\nPlease enter your name, age and salary\n");
scanf(" s %d
%lf", name, &age, &salary);
printf("\n\nTable %s\n",label);
printf("Compiled by %s age %d
$.2lf\n", name, age, salary);
printf("-----------------------------------------------------\n");
for
(loop=0;loop
printf("M | %-20s | ] | .2lf\n",
loop + 1,
entry[loop].name,
entry[loop].age,
entry[loop].salary);
printf("-----------------------------------------------------\n");
return
0;
}
函数名: stpcpy
功 能: 拷贝一个字符串到另一个
用 法: char *stpcpy(char *destin, char
*source);
程序例:
#include
#include
int main(void)
{
char
string[10];
char *str1 =
"abcdefghi";
stpcpy(string, str1);
printf("%s\n", string);
return
0;
}
函数名: strcat
功 能: 字符串拼接函数
用 法: char *strcat(char *destin, char
*source);
程序例:
#include
#include
int main(void)
{
char
destination[25];
char *blank =
" ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%s\n", destination);
return
0;
}
函数名: strchr
功 能: 在一个串中查找给定字符的第一个匹配之处\
用 法: char *strchr(char *str, char
c);
程序例:
#include
#include
int main(void)
{
char
string[15];
char
*ptr, c = 'r';
strcpy(string, "This is a string");
ptr
= strchr(string, c);
if
(ptr)
printf("The character %c is at position: %d\n", c,
ptr-string);
else
printf("The character was not found\n");
return 0;
}
函数名: strcmp
功 能: 串比较
用 法: int strcmp(char *str1, char
*str2);
程序例:
#include
#include
int main(void)
{
char
*buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
int
ptr;
ptr
= strcmp(buf2, buf1);
if
(ptr > 0)
printf("buffer 2 is greater than buffer 1\n");
else
printf("buffer 2 is less than buffer 1\n");
ptr
= strcmp(buf2, buf3);
if
(ptr > 0)
printf("buffer 2 is greater than buffer 3\n");
else
printf("buffer 2 is less than buffer 3\n");
return 0;
}
函数名: strcpy
功 能: 串拷贝用 法: char *strcpy(char *str1, char *str2);
程序例:
#include
#include
int main(void)
{
char
string[10];
char
*str1 = "abcdefghi";
strcpy(string, str1);
printf("%s\n", string);
return 0;
}
函数名: strrev
功 能: 串倒转用 法: char *strrev(char *str);
程序例:
#include
#include
int main(void)
{
char *forward
= "string";
printf("Before strrev(): %s\n", forward);
strrev(forward);
printf("After
strrev(): %s\n", forward);
return
0;
}
函数名: strset
功 能: 将一个串中的所有字符都设为指定字符
用 法: char *strset(char *str, char
c);
程序例:
#include
#include
int main(void)
{
char
string[10] = "123456789";
char symbol =
'c';
printf("Before strset(): %s\n", string);
strset(string, symbol);
printf("After
strset(): %s\n", string);
return
0;
}
函数名: strstr
功 能: 在串中查找指定字符串的第一次出现
用 法: char *strstr(char *str1, char
*str2);
程序例:
#include
#include
int main(void)
{
char *str1 =
"Borland International", *str2 = "nation", *ptr;
ptr =
strstr(str1, str2);
printf("The
substring is: %s\n", ptr);
return
0;
}
函数名: strtod
功 能: 将字符串转换为double型值
用 法: double strtod(char *str, char
**endptr);
程序例:
#include
#include
int main(void)
{
char
input[80], *endptr;
double
value;
printf("Enter
a floating point number:");
gets(input);
value =
strtod(input, &endptr);
printf("The
string is %s the number is %lf\n", input, value);
return
0;
}
函数名: strtol
功 能: 将串转换为长整数
用 法: long strtol(char *str, char **endptr, int
base);
程序例:
#include
#include
int main(void)
{
char *string
= "87654321", *endptr;
long
lnumber;
lnumber =
strtol(string, &endptr, 10);
printf("string = %s long = %ld\n", string,
lnumber);
return
0;
}
函数名: strupr
功 能: 将串中的小写字母转换为大写字母
用 法: char *strupr(char *str);
程序例:
#include
#include
int main(void)
{
char *string
= "abcdefghijklmnopqrstuvwxyz", *ptr;
ptr =
strupr(string);
printf("%s\n", ptr);
return
0;
}
函数名: tolower
功 能: 把字符转换成小写字母
用 法: int tolower(int c);
程序例:
#include
#include
#include
int main(void)
{
int length,
i;
char *string
= "THIS IS A STRING";
length =
strlen(string);
for (i=0;
i
{
string[i] = tolower(string[i]);
}
printf("%s\n",string);
return
0;
}
函数名: toupper
功 能: 把字符转换成大写字母
用 法: int toupper(int c);
程序例:
#include
#include
#include
int main(void)
{
int length,
i;
char *string
= "this is a string";
length =
strlen(string);
for (i=0;
i
{
string[i] = toupper(string[i]);
}
printf("%s\n",string);
return
0;
}