C注意,使用的语言字符串

转载请注明出处!

在C语言没有具体的字符串数据类型,字符串的字符串常量和字符数组的形式。

实际上该字符串是零个或更多字符的字符串。并在整个位模式0NUL字节结束。因此,字符串所包括的字符内部不能出现NUL字节。头文件string.h包括了使用字符串函数所需的原形和声明。虽然并不是必须。但在程序里包括这个头文件确实是个好主意。由于有了它所包括的原型,编译器能够更好地为你的程序运行错误检查。

以下列举了在使用C库中字符串函数时的注意事项,此内容会持续的更新!

1.字符串长度

C库中计算字符串长度的函数原型例如以下:

size_t strlen(cha const *string);

注意函数的返回值为无符号整数,size_t在stddef.h中定义,假设在表达式中使用无符号整数可能导致不可预料的结果。比如以下的两个表达式看上是相等的:

if (strlen(x) >= strlen(y))...
if(strlen(x) - strlen(y)  >= 0)...

其实,它们是不相等的。第一个表达式没有问题,可是第二个表达式因为strlen的返回值为无符号的,所以>= 左边的表达式也是无符号的,所以该表达式是永远为真的!

2. 不受限制的字符串函数

我们常常使用的字符串函数都是"不受限制的",即它们都是通过寻找字符串參数结尾的NUL字符来推断它的长度的。这些函数一般都会指定一块内存用于存放结果字符串,程序猿须要自己保证结果结果字符串不能超过该块内存区域。

2.1. 复制字符串

用于复制字符串的函数strcpy的函数原型例如以下:

char * strcpy(char *dst, const char*src);

该函数会将src中的字符串拷贝到dst中,假设两个字符串中存在重叠的部分,其结果是没有定义的。

目标參数曾经的内容会被覆盖并丢失,即使src比dst的长度更短。

比如:

<pre name="code" class="cpp">char str[] = "Hello, China!"
strcpy(str, "NiHao");

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

Output:
NiHao

程序猿必须保证目标字符数组的空间足以容纳被复制的字符串。假设字符串比字符数组长,多余的字符相同地被复制,它们会覆盖原先存储于数组之后的内存空间的数据,strcpy无法解决问题,他不能推断目标字符数组的长度!

2.2连接字符串

strcat讲一个字符串拼接到还有一个字符串的后面,其原型例如以下:

char *strcat(char *dst, char const *src);

strcat要求dst中包括一个字符串(能够为空字符串),其搜索到该字符串的末尾,并将src中的字符串复制到该位置。假设src和dst存在重叠,其结果是没有定义的。

相同。程序猿必须保证dst字符数组的空间能容纳dst和src总的字符长度!

2.3 字符串比較

字符串的比較原理为对两给字符串逐个比較,直到发现不匹配为止。strcmp的函数原型为:

int strcmp(char const *s1, char cosnt *s2);

假设s1<s2,其返回小于零的值。假设s1大于s2,其返回一个大于零的值。假设相等其返回零。

对于字符串是否相等的推断有的人写法例如以下:

if(!strcmp(s1,s2))

把这个返回值当做布尔值进行測试一种坏风格。由于它有三个不同的返回值:小于。等于,大于。更好地方法为
if(strcmp(s1, s2) == 0)

strcmp的參数必须以NUL字节结尾。否则其会对參数后面的字节进行比較,这样做是没有意义的。

3. 长度受限的字符串函数

C库中包括其它一些字符串处理函数,它们提供一个显式的长度用于限制进行复制和比較的字符串的长度,该机制能够有效的防止难以预料的长字符串从他们的目标中溢出。

相同,这些函数不能结果源參数和目标參数存在重叠的问题。

这些函数的原型例如以下:

char *strncap(char *dst, const char *src, size_t len);
char *stncat(char *dst,  cosnt char *src, size_t len);
int strncmp(char cosnt *s1 , char const*s2, size_t len);

strncpy总是正好将len长度的字符复制到dst中,假设strlen(src)的值小于len, dst数组就用额外的NUL字节填充到len长度。而假设strlen(src)的值大于或等于len,那么仅仅有len个字节被复制到dst中。注意:它的结果将不会以NUL字节结尾,这一定要引起注意!

这个问题仅仅有当你使用strncpy函数创建字符串。然后使用其它str开头的库函数,或者在printf中使用%s格式打印它们时才会出现。在使用不受限制的函数之前。我们必须确定字符串实际上是以NUL字节技术的字符串,考虑以下的样例:

char buffer[BSIZE];

strncpy(buffer, name, BSIZE);

buffer[BSIZE - 1] = 0;

假设name长度小于BSIZE。那么最后的赋值语句没有不论什么效果,可是假设name太长以至于超过了BSIZE,那么最后的赋值语句能够控制buffer以NUL字节结束,以后涉及该字符串的操作都能够正确运行。

strncat总是在目标字符串的末尾加入一个NUL字节。len没有讲原先的字符长度,包括,它只是管src在len复制的字符src在,和src加入的结束NUL字节。无论src串出剩余空间预先存在足够。

strncmp比较起来len字节,假设两个字符串len字符前的不平等性质,该函数返回,假定第一两串len字符等于,该函数返回零。

时间: 2024-10-22 13:50:25

C注意,使用的语言字符串的相关文章

C语言字符串操作大全

转载自:C语言字符串操作总结大全(超详细) 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c)

C语言字符串处理库函数

http://blog.csdn.net/pipisorry/article/details/36898405 使用C语言字符串处理的库函数,务必包含头文件string.h,即#include <string.h> 1. 比较字符串大小函数   1) 忽略大小写---strcasecmp 函数原型: int strcasecmp (const char *s1, const char *s2); 函数说明: 用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异 2)忽略大小写-stric

C语言字符串函数大全

转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# 函数名: stpcpy 功能: 拷贝一个字符串到另一个 用法: char *stpcpy(char *destin, char *source); 程序例: #include<stdio.h> #include<string.h> int main(void) { char string[10]; char *str1 = "abcdefghi

C语言——字符串长度的计算方法

C语言——字符串长度的计算方法 提示:(1)计算字符串长度时关键是要注意辨认转义字符:(2)一个转义字符总是以反斜杠开始,再加一个其他字符组成.所以,遇到反斜杠时要特别注意!!! 1.不带转义字符的字符串   如:“abc!x=/”,其长度为 7   2.带转义字符的字符串   (1) 字符串“abc\n”:其中的'\n'为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的长度为4(而不是5)   (2) 字符串“abc\n\\\'\"":其中有4个转义字符:'\n'

转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 作者:jcsu C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    

C语言 字符串和数字转换函数

atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 double atof(const char *nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.参数nptr字符串可包含正负号.小数点或E(e)来表示指数部分,如123.456或123e-2.

C语言字符串处理函数

函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) {    char string[10];    char *str1 = "abcdefghi";    stpcpy(string, str1);    printf("%sn&

C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】

本文转载自;http://www.cnblogs.com/easyfrog/archive/2011/12/26/C_strstr_split_string.html C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: 下面的这个例子是实现 字符串以分割串分割输出: 1 #include <stdio.h> 2 #include <strin

OC学习将C语言字符串转换为OC字符串

将C语言字符串转换为OC字符串 1 /** 2 * inputNSString:自定义函数 3 */ 4 #import <Foundation/Foundation.h> 5 /** 6 * 将C语言字符串转换为OC语言字符串 7 * @return OC语言字符串 8 */ 9 NSString *inputNSString(){ 10 char arr[256];//假定数组长度为256 11 char ch; 12 int length=0; 13 //while ((ch=getch

C语言字符串声明

重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字符串数组.区别在于,char * a = "nihao"的话,a指针本身是可以变化的,如a = "123",但对字符串常量进行操作是不行的,如,a[0] = '1'是非法的.char a[] = "nihao"表示字符数组初始化为"niha