(转)C语言学习札记(5)-- 字符和字符串

来源:互联网 发布:matlab锯齿波编程 编辑:程序博客网 时间:2024/05/17 23:34

1、字符常量是用以单引号括起来的字符表示的整数值;字符串是作为一个整体对待的一系列字符字符串直接量(string literals)或称”字符串常量“是用双引号标识的。

2、C语言中的字符串是用空字符(null character,‘\0’)结束的字符数组。字符串是用指向字符串中第一个字符的指针访问的。字符串的值是其第一个字符的地址。因此,把C语言中的字符串说成一个指针是正确的。

3、可以在声明语句中把一个字符串赋给一个字符数组或char * 类型的变量。例如:
       char color[] = "blue";
       char * colorPtr = "blue";
    
        在用字符串直接量初始化char * 类型的变量时,某些编译器可能会把该字符串放在不能修改该字符串的某个存储单元中。如果希望能够修改字符串直接量,应该把字符串存储在某个字符数组中。

       在用字符数组存储字符串时,应保证字符数组有足够大的空间来容纳要存储的最大的字符串。如果字符串比存储它的字符数组长,超出数组长度的字符就会把内存中数组之后的数据覆盖掉。

       注意:要像字符串一样打印字符数据,字符数组中必须包含终止字符NULL。

4、‘\a' 转义字符代表响铃。进纸符’\f',垂直制表符'\v',退格符'\b'。

5、<ctype.h>中的函数,返回值均为int:isdigit(int c); isalpha(int c); isxdigit(int c); isalnum(int c); islower(int c); isupper(int c); tolower(int c); toupper(int c); isspace(int c); iscntrl(int c); ispunct(int c); 
isprint(int c); isgraph(int c);

6、<stdlib.h>中的字符串转换函数:
       double atof(const char * nPtr);
       int atoi(const char * nPtr);
       long atol(const char * nPtr);
       double strtod(const char * nPtr, char * *endPtr);
       long strtol(const char * nPtr, char * *endPtr, int base);
       unsigned long strtoul(const char * nPtr, char * *endPtr, int base);

       其中,char * *endPtr,表示指向字符串的指针。

7、如果int和long类型的值都是用4个字节存储的,那么函数atoi和函数atol是等价的。

8、标准输入/输出库<stdio.h>:
       int getchar(void);
       char * gets(char * s);                    //将字符串输入到数组s中,直到遇到新行符或结束符,并追加'\0'
       int putchar(int c);
       int puts(const char * s);
       int sprintf(char * s, const char * format, ...);     //输出结果存储在数组s中(而不是打印到屏幕)
       int sscanf(char * s, const char * format, ...);    //从数组s读取数据(而不是从键盘读取)

9、字符串处理库中的字符操作函数<string.h>:

char * strcpy(char * s1, const char * s2); //字符数组的大小必须足以能够存储该字符串和其终止字符 char * strncpy(char * s1, const char * s2, size_t n); //常见错误:第三个参数小于或等于第二个参数字符串

       char * strcpy(char * s1, const char * s2);     //字符数组的大小必须足以能够存储该字符串和其终止字符
       char * strncpy(char * s1, const char * s2, size_t n);
       //常见错误:第三个参数小于或等于第二个参数字符串的长度时没有为第一个参数追加种子字符NULL
       size_t是运算符sizeof的返回值的整数类型。类型size_t与系统有关,它或者是unsigned long类型,或者是unsigned int类型

       char * strcat(char * s1, const char * s2);
       //第二个参数的第一个字符取代第一个参数字符串的终止符NULL,为了能够存储第一个字符串、第二个        字符串和终止字符,程序员必须保证存储一个字符串的数组要有足够的长度。
       char * strncat(char * s1, const char * s2, size_t n);
       //把第二个字符串中指定数目的字符追加到第一个字符串中,终止字符是自动追加到结果中的
       
       int strcmp(const char * s1, const char * s2);
       int strncmp(const char * s1, const char * s2, size_t n);
       //对第一个字符串和第二个字符串逐个比较。如果相等,返回0;如果第一个小于第二个返回负值;如            果第一个大于第二个返回一个正值;
       
       常见的程序设计错误是以为strcmp和strncmp会在参数相等时返回1.事实上,这两个函数在参数相等时都返回0(C语言的假值)。因此,在测试两个字符串是否相等时,应该把这两个函数的结果与0比较。

10、所有的字符在计算机内都是用一个数值代码表示的,当计算机比较两个字符串时,实际上是比较字符串中相应字符的数值代码。
       在不同的计算机上,表示字符的内部数值代码可能是不同的。
       为了使字符使用标准化形式表示,大多数计算机制造商都是在两种流行的编码模式中选择一种设计计算机的,即:ASCII码(美国标准信息交换码)和EBCDIC码(扩充的二-十进制交换码)。还有其他的一些编码模式,但是这两种模式是最流行的。

11、字符串处理库中的查找函数
   char * strchr(const char * s, int c);
   size_t strcspn(const char * s1, const char * s2); //计算并返回字符串s1中不含s2中字符的起始段的长度
   size_t strspn(const char * s1, const char * s2); //计算并返回字符串s1中只包含s2中字符的起始段的长度
   char * strpbrk(const char * s1, const char * s2);
   char * strrchr(const char * s, int c);
   char * strstr(const char * s1, const char * s2);
   char * strtok(char * s1, const char * s2);
   //strtok把指向当前记号后的下一个字符的指针保存起来并返回一个指向当前记号的指针。以后再调用strtok时,用NULL作为第一个参数。参数NULL表示对strtok的调用应该从上次调用保存起来的string中的位置开始继续把string打断为记号。

12、字符串处理库中的内存函数:
       void * memcpy(void * s1, const void * s2, size_t n);
       void * memmove(void * s1, const void * s2, size_t n);
       int memcmp(const void * s1, const void * s2, size_t n);
       void * memchr(const void * s, int c, size_t n);
       void * memset(void * s, int c, size_t n);

    常见的程序设计错误是:除memmove之外的字符串操作函数在拷贝同一个字符串中的字符时,其结果是不确定的。

13、字符串处理库中的其他函数
       char * strerror(int errornum);//用错误编号做参数,建立错误报文字符串,返回指向该字符串的指针;
       size_t strlen(const char * s); //计算字符串s的长度,返回NULL前的字符个数

转自:http://www.pczpg.com/html/bianchengkaifa/C___C/20090618/7367.html

原创粉丝点击