C语言中字符串的处理方式

http://www.cnblogs.com/robin-ty/archive/2010/09/03/1817294.html

 

交流问题”

                              –《C语言程序设计
现代艺术》

 

  写多了 Java 代码,对 String 类
很是爱护,可惜经典的 C
语言没有。。。最近于召开程序过程被,发现对C语言字符串的拍卖非常模糊,一会儿据此数组,一会儿于是指针,一会儿而引入
string.h。。。于是决定总结一下C语言中字符串的拍卖,一尽管作为笔记,二虽然当技术交流和豪门享受。

  1. 字符串字面量(字符串常量,在C标准被称,字符串字面量)
    哪存储字符串字面量  从精神上而言,C语言把字符串字面量作为字符数组来拍卖。当C语言编译器在次中遇长度为n的字符串字面量时,它见面吧字符串字面量分配长度也n+1的内存空间,在最终增加一个附加的字符——空字符(\0)。
    字符串字面量的操作

      通常状态下得以以任何C语言允许用 char *
    指针的地方用字符串字面量。如:
    char*p; p
    =”abc”;

    本条赋值操作不是复制 “abc” 中的字符,而就是要是 p
    指于字符串的第一独字符。

  2. 字符串变量   一些编程语言也声明字符串提供了不同寻常的
    string
    类型。C语言采取了不同之方法:只要保证字符串是为空字符串结尾的,任何一样维的字符数组都可就此来储存字符串。如果编写好之字符串处理函数,请千万注意要科学地拍卖空字符。
      假设需要变量用来存储最多80单字符的字符串。既然字符串会在末尾处需要空字符,那么只要声明的变量是富含81独字符的数组。
    #define STR_LEN 80
    /* 惯用法 */char
    str[STR_LEN +1];

    本着宏加一底这种办法是C程序员常用之艺术。
    初始化字符串变量
    char date1[8]
    =”June
    14″;

    date1: | J | u | n | e |   | 1 | 4 | \0 |
    char date2[9]
    =”June
    14″;

    date2: | J | u | n | e |   | 1 | 4 | \0 | \0 |
    大体上的话,这种行为和C语言处理数组初始化的法子一致。
    字符串变量的声明可以忽略它的长短。这种景象下,编译器会活动计算长度:
    char date3[] =”June
    14″;

    编译器为date3分配8独字符的空间。 字符数组与字符指针
    一起来比一下脚两只声明:
    char date[] =”June
    14″;

    其声明date是个字符数组。和这宣称相似的是底下这宣称:
    char*date
    =”June
    14″;

    其声明date是个因于字符串字面量的指针。
    [注意],不可知错误地认为点两种植date可以换。两者之间有着鲜明的区别: (1)
    在声明为数组时,就比如任意数组元素一样,可以修改存储于date中之字符。在声明也指针时,date指向字符串字面量。(2)
    在声明为数组时,date是数组名。在宣称也指针时,date是变量,这个变量可以当程序执行期间针对任何字符串。
      使用好改的字符串,那么尽管设树字符数组来存储字符串。这时声明指针变量是不够的。下面的扬言如编译器为指针变量分配了足的内存空间:
    char*****p;

    惋惜的是,它不也字符串分配空间。在运用p作为字符串之前,必须将p指向字符串数组。一栽或是把p指向曾在的字符串变量:
    char str[STR_LEN +**1**], ***p; p =str;**

    现p指向了str的第一个字符,所以可以把p作为字符串使用了。

 

  1. 字符串的读写

 

  3.1 用
printf 函数和 puts 函数写字符串

  %s 允许 printf 函数写字符串。如:

char
str[] =”Are we
having fun yet?”; printf(“Value of
str: %s\n”, str);

若仅显示字符串的等同有些,可以为此 %.ps。这里的 p
是使显得的字符数量。语句

printf(“%.6s\n”,
str);

见面显得有

Are we

  C函数库还提供puts函数。

puts(str);

  

  3.2 用 scanf 函数和 gets
函数读字符串

  在 scanf 函数调用中,不需要在 str 前补加运算符 &。因为 str
是反复组名,编译器会自动把其当做指针来处理。调用时,scanf
函数会越了空白字符,然后读入字符,并且将读入的字符存储到 str
中,知道遇到空白字符为止。scanf
函数始终会以字符串末尾存储一个空字符。用
scanf 函数读入字符串永远不会见含有空白字符。因此,scanf
函数通常不见面读入一整行输入。换行符会使 scanf
函数停止读入,空格符或制表符也会见出相同的成效。可以参考下面的例证:

C语言 1😉

#include <stdio.h>
#define STR_LEN 80
int main() { char
str[STR_LEN +1];
printf(“input a string:”);
scanf(“%s”, str);
printf(“String inputed is:%s\n”, str);
return0; }

C语言 2😉

 

运转结果如下:

Input a string:this is a
string String is:this

为每次读入一整行输入,可以使 gets 函数。类似于 scanf 函数,gets
函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面 gets
函数有些不同为 scanf 函数:

 

  (1) gets 函数不会见以初始念字符串之前超过了空白字符( scanf 函数会过了)。

  (2) gets 函数会连读入直到找到换行符才停止(scanf
函数会在任意空白字符处停止)。

  此外,gets
函数会忽略掉换行符,而不会见拿它存储到数组中,用空字符代替换行符。

 

  3.3 逐个字符读字符串

  因为
scanf 函数和 gets 函数都发高风险且不够利索,C
程序员经常会面修好的输入函数。通过每次一个字符的方式来读入字符串。下面是投机编写的读取字符串的函数 read_line():

C语言 3😉

C语言 4C语言 5

int
read_line(char strp[], int n) {
char ch; int i
=0;
while((ch =
getchar()) !=’\n’)
if(i < n)
str[i++] = ch;
str[i] =’\0′;
/* terminates string */return i;
/* number of characters stored */
}

C语言 6😉

返之前,read_line 函数在字符串的末梢放置了一个空字符。就像 scanf
函数和 gets
函数一样,标准函数会自动在输入字符串的最后放置一个空字符串。然而,如果自己写输入函数,必须要考虑到这或多或少。