程序设计竞赛——C++常用库函数

本文详细介绍了C++编程中常用的库函数,包括memcpy、strncpy、位运算和类型转换等,并通过示例代码展示了它们的使用方法。此外,还提及了其他如字符串处理、数学和浮点数转换的函数。
部署运行你感兴趣的模型镜像

首先就是memcpy

表头文件: #include <string.h>

定义函数: 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-拷贝的字符个数

所属文档: <string.h>

 

还是上面的例子,这个程序可以这样写:

#include<stdio.h>

#include<string.h>

int main()

{

    char str[] ="wangyucao1989";

 

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

#include <math.h>

 

int main(void)

{

  int number =-1234;

 

 printf("number: %d  absolutevalue: %d\n", number, abs(number));

  return 0;

}

函数名: atof

功  能: 把字符串转换成浮点数

用  法: double atof(const char *nptr);

程序例:

#include <stdlib.h>

#include <stdio.h>

 

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

#include <stdio.h>

 

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

#include <stdio.h>

 

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)(constvoid *, const *));

程序例:

 

#include <stdlib.h>

#include <stdio.h>

 

#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;

 

   /* The castof (int(*)(const void *,const void*))

      is neededto avoid a type mismatch error at

      compiletime */

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

#include <math.h>

 

int main(void)

{

   float  number = -1234.0;

 

  printf("number: %f  absolutevalue: %f\n",

   number,fabs(number));

   return 0;

}

 

函数名: fcvt

功  能: 把一个浮点数转换为字符串

用  法: char *fcvt(double value, int ndigit, int *decpt, int *sign);

程序例:

 

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

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; /* scientific

                       notation */

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

#include <stdio.h>

 

int main(void)

{

   char str[25];

   double num;

   int sig = 5;/* significant digits */

 

   /* a regularnumber */

   num = 9.876;

   gcvt(num,sig, str);

  printf("string = %s\n", str);

 

   /* a negativenumber */

   num =-123.4567;

   gcvt(num,sig, str);

  printf("string = %s\n", str);

 

   /* scientificnotation */

   num =0.678e5;

   gcvt(num,sig, str);

  printf("string = %s\n", str);

 

   return(0);

}

函数名: itoa

功  能: 把一整数转换为字符串

用  法: char *itoa(int value, char *string, int radix);

程序例:

 

#include <stdlib.h>

#include <stdio.h>

 

int main(void)

{

   int number =12345;

   charstring[25];

 

   itoa(number,string, 10);

  printf("integer = %d string = %s\n", number, string);

   return 0;

}

 

函数名: labs

功  能: 取长整型绝对值

用  法: long labs(long n);

程序例:

 

#include <stdio.h>

#include <math.h>

 

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

#include <string.h>

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

#include <stdio.h>

#include <mem.h>

 

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

#include <stdio.h>

 

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

#include <stdlib.h>

#include <string.h>

 

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

#include <stdio.h>

 

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

#include <conio.h>

 

int main(void)

{

   charlabel[20];

   charname[20];

   int entries =0;

   int loop,age;

   doublesalary;

 

   structEntry_struct

   {

      char  name[20];

      int   age;

      floatsalary;

   } entry[20];

 

/* Input a label as a string of characters restrictingto 20 characters */

  printf("\n\nPlease enter a label for the chart: ");

  scanf("%20s", label);

  fflush(stdin);  /* flush the inputstream in case of bad input */

 

/* Input number of entries as an integer */

  printf("How many entries will there be? (less than 20) ");

  scanf("%d", &entries);

  fflush(stdin);   /* flush theinput stream in case of bad input */

 

/* input a name restricting input to only lettersupper or lower case */

   for (loop=0;loop<entries;++loop)

   {

     printf("Entry %d\n", loop);

     printf("  Name   : ");

     scanf("%[A-Za-z]", entry[loop].name);

     fflush(stdin);  /* flush the inputstream in case of bad input */

 

/* input an age as an integer */

      printf("  Age   : ");

     scanf("%d", &entry[loop].age);

     fflush(stdin);  /* flush the inputstream in case of bad input */

 

/* input a salary as a float */

     printf("  Salary : ");

     scanf("%f", &entry[loop].salary);

     fflush(stdin); /* flush the input stream in case of bad input */

   }

 

/* Input a name, age and salary as a string, integer,and double */

  printf("\nPlease enter your name, age and salary\n");

  scanf("%20s %d %lf", name, &age, &salary);

 

 

/* Print out the data that was input */

  printf("\n\nTable %s\n",label);

  printf("Compiled by %s  age%d  $%15.2lf\n", name, age, salary);

  printf("-----------------------------------------------------\n");

   for(loop=0;loop<entries;++loop)

     printf("%4d | %-20s | %5d | %15.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 <stdio.h>

#include <string.h>

 

int main(void)

{

   charstring[10];

   char *str1 ="abcdefghi";

 

  stpcpy(string, str1);

  printf("%s\n", string);

   return 0;

}

 

 

 

 

函数名: strcat

功  能: 字符串拼接函数

用  法: char *strcat(char *destin, char *source);

程序例:

 

#include <string.h>

#include <stdio.h>

 

int main(void)

{

   chardestination[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 <string.h>

#include <stdio.h>

 

int main(void)

{

    charstring[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 <string.h>

#include <stdio.h>

 

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

#include <string.h>

 

int main(void)

{

    charstring[10];

    char *str1 ="abcdefghi";

 

   strcpy(string, str1);

   printf("%s\n", string);

    return 0;

}

 

函数名: strrev

功  能: 串倒转用 法: char *strrev(char *str);

程序例:

 

#include <string.h>

#include <stdio.h>

 

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

#include <string.h>

 

int main(void)

{

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

#include <string.h>

 

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

#include <stdlib.h>

 

int main(void)

{

   charinput[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 <stdlib.h>

#include <stdio.h>

 

int main(void)

{

   char *string= "87654321", *endptr;

   long lnumber;

 

   /* strtolconverts string to long integer  */

   lnumber =strtol(string, &endptr, 10);

  printf("string = %s  long =%ld\n", string, lnumber);

 

   return 0;

}

 

 

函数名: strupr

功  能: 将串中的小写字母转换为大写字母

用  法: char *strupr(char *str);

程序例:

 

#include <stdio.h>

#include <string.h>

 

int main(void)

{

   char *string= "abcdefghijklmnopqrstuvwxyz", *ptr;

 

   /* convertsstring to upper case characters */ ptr = strupr(string);

  printf("%s\n", ptr);

   return 0;

}

 

 

函数名: tolower

功  能: 把字符转换成小写字母

用  法: int tolower(int c);

程序例:

 

#include <string.h>

#include <stdio.h>

#include <ctype.h>

 

int main(void)

{

   int length,i;

   char *string= "THIS IS A STRING";

 

   length =strlen(string);

   for (i=0;i<length; i++)

   {

       string[i]= tolower(string[i]);

   }

  printf("%s\n",string);

 

   return 0;

}

 

 

 

函数名: toupper

功  能: 把字符转换成大写字母

用  法: int toupper(int c);

程序例:

 

#include <string.h>

#include <stdio.h>

#include <ctype.h>

 

int main(void)

{

   int length,i;

   char *string= "this is a string";

 

   length =strlen(string);

   for (i=0;i<length; i++)

   {

      string[i]= toupper(string[i]);

   }

 

  printf("%s\n",string);

 

   return 0;

}

 

您可能感兴趣的与本文相关的镜像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值