现在的位置: 首页 > 综合 > 正文

C/C++——字符串和字符数组

2018年04月22日 ⁄ 综合 ⁄ 共 2313字 ⁄ 字号 评论关闭

    C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。


<1> 定义: char c[10]

 

字符型与整型互相通用,因此 int c[10] 也可以定义字符数组。但由于两种类型分配字节不同, 用整型来定义会浪费空间, 另外这样定义实际意义也不大, 只是为了说明其合法性。

<2> 初始化: 

    最简单的方法即逐个赋值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10个字符分别赋绐c[0]到c[9]10个元素。

    如果初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'/0')。
    如char c[12]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 则c[10]、c[11]值都为'/0' 。

 


 

    C语言中,将字符串作为字符数组来处理。一般我们用字符数组来存放字符串时,都要先确定一个足够大的数组,而实际并用不了那么多,而我们只关心其有效位,为测定字符串实际长度,C规定了一个"字符串结束标志",以字符 '/0' 代表。如果有一个字符串,其中第10个字符为'/0',则此字符串的有效字符为9个。也就是说,在遇到字符'/0'时,表示字符串结束,由它前面的字符组成字符串。
    系统对字符串常量也自动加一个'/0'作为结束符。

    对于语句: pirntf("How do you do? /n"); 实际上该字符串在内存中存放时,系统自动在最后一个字符'/0'的后面加了一个'/0'作为字符串结束标志,在执行printf函数时,每输出一个字符检查一次,看下一个字符是否'/0'。遇'/0'就停止输出。

    可以用字符串常量来初始化字符数组。如:

    char c[]={"I am happy"};

    也可直接写成:

    char c[]="I am happy"; 注意此时数组的长度不是10,而是11,因为系统自动加上了'/0'结束符。

 


 

    字符数组不要求最后一个字符为'/0',而为了使处理字符数组和字符串的方法一致,便于测定字符串的实际长度,能及方便在程序中处理, 在字符数组末尾也常加上一个'/0'。

 


 

<3> 字符数组的输入输出 

    (1) 逐个字符输入输出。用格式符"%c"输入或输出一个字符。

    (2) 将整个字符串一次输入或输出。用"%S"格式符,意思是输出字符串(String)。例如:

  char c[]={"china"};
  printf("%S", c);

如果一个字符数组中包含一个以上'/0',则遇第一个'/0'时输出就结束。

    (3) 若输入字符串长度超过字符数组所定义的长度时,将造成数组下标越界,但系统对此并不报错。

    (4) 用%S格式输入字符时,遇空格、Tab键和回车将自动结束输入。

 


 

用scanf函数输入时, 遇到空格则认为一个字符串结束。试验如下:

#include <stdio.h>
int main()
{
    char str1[5], str2[5], str3[5];
    scanf("%s %s %s", str1, str2, str3);
    printf("%s %s %s/n", str1, str2, str3);
    return 0;
}

运行结果:
================================
how are you↙
how are you
================================

#include <stdio.h>
int main()
{
    char str[13];
    scanf("%s", str); /* 注意输入项为数组名,而非 &str */
    printf("%s/n", str);
    return 0;
}

运行结果:
================================
how are you?↙
how
================================

由第二个程序可知,实际并未将这12个字符加上'/0'送到数组str中,而是将空格前的字符"how"送到str中,将其视为字符串处理,在其后加上'/0' 。

 C语言中数组名代表该数组的起始地址。

 

转载自:http://blog.pfan.cn/wentao/11649.html

 

 

补充:

1.sizeof(s),得出的长度不同。

对于字符串得到的是指针类型的长度(为4)。

对于字符数组得到的是字符数组的长度。

2.char* s=”hello”;

s[0]='a';//wrong!运行时显示为“段错误”。

字符数组是可以修改的。

3.作为返回值时不同。

char* test(){

char ch[5]={'h','i'};//gcc 会警告:返回局部变量。

return ch;

这个函数是错误的,因为字符数组ch是局部变量,当test调用结束是占用的空间将被释放。

改为:static char ch[5]={'h','i'};

或: char* ch=”hi”;

就可以了。

4.声明外部变量时,字符数组和字符串为不同类型。

File1.中:char version[]=”2.12”;

File2. : char* version=”2.12”;

File3. : extern char* version;

实际上,File3中version只能引用File2中的值,而引用File1中的 version时导致类型冲突。

 

转载自:http://blog.csdn.net/bird67/archive/2009/10/21/4709328.aspx

抱歉!评论已关闭.