liuchuanwu的个人博客分享 http://blog.sciencenet.cn/u/liuchuanwu

博文

C语言的字符串和指针

已有 9451 次阅读 2014-1-20 17:02 |个人分类:C语言|系统分类:科研笔记| C语言, 字符串, 指针

对一个问题感到迷惑时,最好的办法是写个总结。此篇关于C语言中的字符串和指针。


一、字符串常量

C语言字符串常量用一对双撇号("")括起来。如"How are you"。而字符常量用一对单撇号括起来。因此"a"是字符串常量而'a'是字符常量。也不能将一个字符串常量赋给一个字符变量。字符串常量和字符常量的不同在于系统给字符串常量的结尾加上一个字符串结束标志,C语言使用空字符""做为结束标志,因此“How are you”在内存中占12个字节。字符串常量代表指向无名数组的指针。因为字符串常量返回字符串首地址。故其可以作为一个指针常量来使用。如用"abcdef"[2]和*("abcdef"+2)表示字符串中的'c'。


二、字符串变量

C语言中没有专门的字符串变量,字符串用一维字符数组表示。数组名是字符数组地址,字符元素连续存储。如:

char str[N]; //N为一整数。

char *p; //等价与char p[];

p = str;

此处声明一可存N个字符的数组,每个字符需要1个字节,故系统为此字符串分配了N个字节。首地址是str(本文也称为字符串名),也等于&str[0];故可str可赋给指针p; 第i个(从0开始)字符为str[i]或*(str+i)。因为字符串实际所使用的内存可能少于N。那么通过首地址我们如何知道字符串的实际内容呢?对于这样一个线性表,常见有两种方法:一种是在字符串开头开辟一块区域存储字符串长度。另一种是使用字符串结束标志。C语言使用第二种方法,以空字符''做为字符串结束标志,第一个空字符前的所有字符构成一个字符串。对于字符串常量C语言也自动在结尾加上一个''做为结束符。


三,字符数组的初始化

字符数组的初始化有多种方式:

char str[100] = {"This is a string"}; //从17以后都是''。

char str[100] = "This is a string"; //花括号可以省略

当数组大小省略时,系统自动计算大小。但注意其大小包含结尾的''

char str[] = "This is a string";

以上系统自动计算数组长度为17。如果声明的大小小于或等于实际长度,在对字符串进行操作是时可能不能正确判断字符串的结束位置。以上赋值方法不完全等同于

char *str = "This is a string"

因为此时str是指针,可以被修改。而前述的方法中str是数组名,不能被修改。C语言数组大小为变量时不能在声明的同时初始化。


除初始化外,不可以通过str = "abcdef"将一个字符串常量直接付给一个字符数组,因为str做为数组名实际是一个地址常量。因而str1 = str2的形式也不合法,因为这个语句试图赋值给一个常量。可以使用字符串复制函数strcpy()或strncpy()进行字符串复制。


四,字符串的输入输出

0、单个字符的输入输出

int fputc(int c, FILE *stream)把字符c写到stream中,返回所写的字符。错误时返回EOF

int putc(int c, FILE *stream)与fputc()等价。不同之处为:当putc函数被定义为宏时,它可能多次计算stream的值

int fgetc(FILE *stream)返回stream中的下子个字符,并转换为unsigned char,错误时返回EOF。

int getc(FILE *stream)与fgetc()等价。不同之处为:当getc函数被定义为宏时,它可能多次计算stream的值

int getchar(void)等价于get(stdin)

int putchar(int c)等价于putc(c, stdout)

1、一般输入输出

int puts(const *s) 把字符串str输出到终端(屏幕),返回一个非负整数,或错误时返回EOF。

char *gets(char *s) 从终端输入字符串到str,返回str的起始地址,或错误时返回NULL。

int fputs(const char *s, FILE *stream) 把字符串s写到stream中

char *fget(char *s, int n, FILE *stream) 读入最多n-1个字符到字符数组s中,然后加''。遇新行终止,注意此时包括前一行结尾的'n'字符。

2、直接内存输入输出

size_t fread(void *ptr, size_t size, size_t n, FILE *stream)  从stream读入最多n个size字节长的数据到ptr数组里。返回所读入的数据个数。

size_t fwrite(const void *ptr,size__t size, size_t n, FILE *stream)  从ptr数组写入n个size字节长的数据到stream中,返回所写数据个数。

直接输入输出的速度很快。

3、使用%s格式输入输出,如:

int printf(const char *format,...) 格式输出到终端,返回写入的字符数目。

int sprintf(char *str, const char *format,...) 格式输出到字符串目标字符串str

int fprintf(FILE *fp,char *format, ...)格式输出到文件fp

int scanf(const char *format,...) 从终端输入,返回读入的数据个数或错误时返回EOF

int sscanf(const char *str, constchar *format,...) 从字符串str读取

int scanf(FILE *fp, char *format)  从文件fp格式输入。

设m,n为整型常量。具体格式有

%ms(或%-ms),若字符串长度小于m,输出占m列,左(或右)端补空格,若字符串本身长度大于m则突破m的限制。m等于0时可省略,即%s。

%m.ns(或%-m.ns)取字符串左端开始头n个字符。输出占m列。左(或右)端补空格。若n>m,则m自动取n值。m或n等于0时可省略,即%m.s(输出m个空格),%.ns(输出头n个字符)。%.s(无输出)。

当m,n为变量时可用*格式输出,如

int m = 5, n = 2;

printf("%*.*s",m, n, str );

除格式输入输出外也可以用puts(str)和gets(str)直接输出输入字符串str。

当文件指针为stdin时,代表标准输入终端,一般是键盘,stdout时是标准输出终端,一般是屏幕。


五、字符串函数

C语言有多个字符串函数,一般包含在头文件<string.h>中,具体参考C函数手册。


六、字符串做为函数的参数和返回值

C语言中,char *型变量和字符串常量可以正常函数传递给函数形式参数。作为返回值char *型函数返回字符串的首地址。但此地址后的的字符串在函数返回后可能发生截断。为了得到调用函数后的字符串,可以将要返回的字符串声明为全局字符数组变量。


(未完待续)


2014年1月20日



https://wap.sciencenet.cn/blog-1005104-760765.html

上一篇:C语言的数组和指针
下一篇:《C陷阱与缺陷》读书笔记

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-5-13 14:23

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部