-
2019-01-09 19:48:55
在C语言中,是将字符串作为字符数组来处理的。例如,如下程序:
#include <stdio.h> int main() { char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'}; int i; for(i=0;i<15;i++){ printf("%c",c[i]); } printf("\n"); return 0; }
输出:
就是用一个一维的字符数组来存放字符串“I am a student.”的,字符串中的字符是逐个存放到数组元素中的。在该例中,字符串的实际长度与数组长度相等。
在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的有效长度。例如,定义一个字符数组长度为100,而实际有效字符只有40个。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符串“\0”作为结束标志。如果字符数组中存有若干字符,前面9个字符都不是空字符(’\0‘),而第10个字符是’\0‘,则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符’\0‘时,表示字符串结束,把它前面的字符组成一个字符串。
C系统在用字符数组存储字符串常量时会自动加一个’\0‘作为结束符。例如”C program“共有9个字符。字符串是存放在一维数组中的,在数组中它占10个字节,最后一个’\0‘是由系统自动加上的。
有了结束标志’\0‘后,字符数组的长度就显得不那么重要了。在程序中往往依靠’\0‘的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度,当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串长度。
说明: ’\0‘代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个”空操作符“,即它什么也不做。用它来做字符串标志不会产生附加的操作和增加有效字符,只起一个供辨别的标志。更多相关内容 -
字符串所占字节数分析
2021-05-19 10:02:55'\t' 是一个转义字符相当于键盘“Tab”键‘a’ 普通字符'\017'转义字符ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么符号)‘b’ 普通字符‘c’普通字符然后再加一个字符串结束标志‘\0’...string与strlen
字符串赋值的时候会不会在末尾自动添加'\0'?
char *s="\ta\017bc"中指针变量s 指向的字符串所占字节数是6的原因。
'\t' 是一个转义字符相当于键盘“Tab”键
‘a’ 普通字符
'\017'转义字符ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么符号)
‘b’ 普通字符
‘c’普通字符
然后再加一个字符串结束标志‘\0’所以指针变量s,指向的字符串所占字节数是6
char *s="\ta\017bc";
for(;*s!='\0';s++)printf("*")//用查询的方法去统计字节数
需要明确的第一点,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
例如以下代码片断理论上也是可以编译通过的:
char str[]="abcdefg";
printf("%d\n",strlen(&str[5]));
结果应当为2。该例中,strlen从字符str[5]即'f'开始计数,当到达'g'之后遇到'\0'并停止计数。因此结果为2。
str2和str3的主要区别就在于C/C++字符串中,允许形如“\056”这样的所谓转义字符存在,它们仅表示一个字节位(byte),一般用于输出无法直接通过键盘输入的字符。
str0的sizeof为8,导致没有\0结束,因此strlen的返回是不可预期的。
str1的sizeof实际上是9,会自动加\0结束。
str2的\056会被解释成8进制数056表示的字符,因此strlen是9,转义字符
str3的\0会被解释为结束符
二、sizeof深入理解。
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。sizeof还可以用函数做参数,比如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:
fun(char [8])
fun(char [])
都等价于 fun(char *)在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去
10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(dataalignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MSVC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragmapack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advancedcompiler页中的Data alignment为按字节对齐。
11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式
三、结束语
sizeof使用场合。
1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:
void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2.用它可以看看一类型的对象在内存中所占的单元字节。
void * memset(void * s,int c,sizeof(s))
3.在动态分配一对象时,可以让系统知道要分配多少内存。
4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
-
字符串与字符串结束标志
2020-02-05 16:20:331、在C语言中,是将字符串作为字符数组来处理的。例1就是用一个一 维的字符数 来存放字符串I am a student. ”的,字符串中的字符是逐个存放到数组元素中的。...语言规定了个“字符串结束标志”。...1、在C语言中,是将字符串作为字符数组来处理的。例1就是用一个一 维的字符数 来存放字符串I am a student. ”的,字符串中的字符是逐个存放到数组元素中的。在该例中,字符串的实际长度与数组长度相等。
2、在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。例如 文一个字符数组长度为100,而实际有效字符只有40个。为了测定字符串的实际长。语言规定了个“字符串结束标志”。 以字符’\0’作为结束标志。如果字符数干字符前面9个字符都不是空字符()0’),而第10个字符是\0,则认为数组中有一个符串,其有效字符为9个。也就是说,在遇到字符’\0’时,表示字符串结束,把它前组成一个字符串。
注意:C系统在用字符数组存储字符串常量时会自动加一个\0作为结束说明:C program”共有9个字符,字符串是存放在一维教组中的,在数组中它占10个节一个字节’\0’是由系统自动加上的。
有了结束标志\0后,字符数组的长度就显得不那么重要了。在程序中往往依靠检测‘\0’的位置来判定字符申是否结束,而不是根据数组的长度来决定字符串长度,是否此,为 在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度,符数果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串长度;
例1:
#include<stdio.h>
int main()
{
char[15]={‘I’,’ ‘,‘a’,‘m’,’ ‘,‘a’,’ ‘,‘s’,‘t’,‘u’,‘d’,‘e’,‘n’,‘t’,’.’};
int i;
for(i=0;i<15;i++}
printf("%c",c[i]);
printf("\n");
return 0;
}说明
字符数组并不要求它的最后一个字符为’\0,甚至可以不包含0’。像以下这
精格依祥写完全是合法的,
如:charc[5]={‘C’,‘h’,‘i’,‘n’,‘a’);
是否需要加’0’,完全根据需要决定。由于系统在处理字符串常量存储时会自动加一个\0’,因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处 理,在字符数组中也常常人为地加上一个’\0’。
例如:
charc[6]={‘C’,‘h’n’,‘a’,’\0’}
这样做,便于引用字符数组中的字符串。
如定义了以下的字符数组:
char[ ]={“C program.”}
由于系统自动在字符串常量的最后一个字符后面加了一个0’,因此c数组的存储情况如下:
若想用一个新的字符串代替原有的字符串"C program.",如从键盘输人Hello’分别赋 给c数组中前面5个元素。如果不加\0’的话,字符数组中的字符如下:
新宇符串和老字符串连成-片.无法区分开。 如果想输出字符数组中的字符串 ,则会连续输出:
Hellogram.
如果在"Hello"后面加一个‘0’ ,它取代了第6个字符’g’.在数组中的存储情况为
‘\0’是字符申结束标志,如果用以下语句输出数组C中的字符串:
printf("%s\n" ,c); //输出数组c中的字符串
在输出字符数组中的字符串时,遇’\0’就停止输出,因此只输出了字符H"Hell".而不会输 出“Hllogram." -
字符串的结束标志是什么?
2021-05-19 14:00:13为了测定字符串的实际长度,C++规定了一个“字符串结束标志”,以字符“′\0′”代表;在程序中往往依靠检测“′\0′”的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。字符串的结束标志是′\0...字符串的结束标志是“′\0′”。为了测定字符串的实际长度,C++规定了一个“字符串结束标志”,以字符“′\0′”代表;在程序中往往依靠检测“′\0′”的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。
字符串的结束标志是′\0′。
为了测定字符串的实际长度,C++规定了一个“字符串结束标志”,以字符′\0′代表。在上面的数组中,第11个字符为′\0′,就表明字符串的有效字符为其前面的10个字符。也就是说,遇到字符′\0′就表示字符串到此结束,由它前面的字符组成字符串。
扩展资料:
对一个字符串常量,系统会自动在所有字符的后面加一个′\0′作为结束符。例如字符串″I am happy″共有10个字符,但在内存中它共占11个字节,最后一个字节′\0′是由系统自动加上的。
在程序中往往依靠检测′\0′的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度。
推荐教程:《C语言》
-
单字节字符串、宽字符串和多字节字符串
2019-10-25 09:07:23调查报告:了解单字节字符串、宽字符串 和多字节字符串等C/C++语言字符串表示方 法,总结其原理、存储、操作、应用等特 征,并编制报告。 单字节字符串(Single-Byte): 原理:每个字符用一个字节表示。这就决定了... -
C++字符数组的输入输出和字符串结束标志使用讲解
2021-05-20 16:16:53C++字符数组的输入输出字符数组的输入输出可以有两...在运行时输入一个字符串,如:China↙在内存中,数组str的状态如图5.9所示,在5个字符的后面自动加了一个结束符′\0′。输出时,逐个输出字符直到遇结束符′\0′... -
C++字符串和字符串结束标志
2016-07-18 19:24:34用一个字符数组可以存放一个字符串中的字符。如 char str[12]={′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′}; 用一维字符数组str来存放一个字符串″I am happy″中的字符。字符串的实际长度... -
\0 字符串的结束标志
2019-10-17 13:56:35'\0'就是 字符串结束标志。 %s ,打印Log ,需要添加\0识别字符串的结束。 '\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。在数值类型里就代表数字0。 数值类型存储时,最高位决定正负... -
string字符串以什么结尾
2021-03-11 14:07:58java怎么判断一个字符串以什么结尾?主要是使用String对象的endwith方法,如果是,则返回true,如果不是则返回false。 Java是一种可以撰写跨平台应用软件的面向对象的程序...先你要知道java字符串不是以\0结束。 Jav... -
C语言字符串的长度与字符串内存长度区别
2020-06-29 13:46:09“AB”这个字符串的所占内存长度是多少? 赋值给字符数组后会不会改变呢? char a[] = “AB”; 那么a的字符长度是多少?a的内存长度是多少? 代码测试: char a[] = "AB"; int L = strlen("AB"); int M = sizeof... -
C语言:字符串在内存中的储存方式和计算字符串的大小
2021-03-23 16:55:311.字符串的存储方式 :字符串在内存中,除了有效字符以外的,还会自动在后面补一个’\0’,作为字符串的结束标识。 2.真正计算有效字符的长度 用 strlen a4[ ] 中的 [ ] 不写大小,数组的大小是会根据初始化的时候... -
c语言怎么进行字符串比较
2021-05-26 01:16:47比较方法:1、bcmp(),比较字符串的前n个字节是否相等;2、strcmp(),区分大小写的比较字符串;3、stricmp(),不区分大小写的比较字符串;4、strncmp()或strnicmp(),区分大小写的比较字符串的前n个字符。本教程操作... -
C++ 字符数组与字符串的使用及加结束符'\0'的问题
2019-03-09 21:51:211、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ ‘I’,’ ‘,‘a’,‘m’,’ ‘,‘h’,‘a’,‘p’,‘p’,‘y’}; 即把10个字符分别赋给str[0]到str... -
字符型数据和字符串常量
2021-04-04 22:08:07字符型数据是计算机中用来表示英文字母...字符串常量是由一对双引号括起来的字符序列。例如,“CHINA”,“C program”,“$12.5”等都是合法的字符串常量。 字符串常量和字符常量是不同的量。它们之间主要有以下 ... -
c语言字 字符串转换成数组_c语言中的字符数组与字符串
2020-11-21 05:17:481、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号... -
C语言字符串常量
2021-05-05 20:05:382、字符串常量中的字符依次存储在内存中一块连续的区域内,并把空字符“\0”(ASCII码值为0)自动附加到字符串尾部作为字符串结束标志。所以,对于字符个数为n的字符串所占的内存空间为n+1个字节。 3、区别字符串与... -
【C】C语言数组与字符串(包括:字符串与字符数组)
2018-05-04 09:25:33在程序设计中,为了方便处理,...因此按照数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章中介绍到... -
C语言字符串
2021-05-21 03:01:02@[toc]在很多教程中,字符串不过是一个以0结束的字符数组,但是,在我看来,字符串虽然不是C语言基本数据类型,但它比任何数据类型都重要,因为字符串是最常用的数据。一、字符串的概念我们可以把字符串储存在char... -
字符串 - NUL - NULL - ‘\0‘ - 判断字符串 `s2` 是否包含字符串 `s1` 的排列
2020-03-18 20:46:53字符串 - NUL - NULL - ‘\0’ - 判断字符串 s2 是否包含字符串 s1 的排列 ...由于 NUL 字节是用于终结字符串的,所以在字符串内部不能有 NUL 字节。在一般情况下,这个限制并不会造成问题。之所以选择 NUL 作为 -
关于字符串结束符'\0'、字符串定义方法
2017-07-19 10:30:52字符串定义方法有2种方法:1)字符数组2)字符指针初始化1)字符数组方式初始化大致3种:(1) char str[10]="12345"或者char str[10]={'1','2','3','4','5'}; 这种方式初始化,系统会自动从未初始化的元素开始,将... -
C语言中关于字符串的使用,以及字符串的存储方式
2019-12-21 09:55:36由于C语言是最基础的语言,所以对于C语言中字符串的使用,有两种方法 1.定义指针,给其一个指向,完成对字符串的引用。这里需要注意野指针的存在,要给指针一个指向,或者让其指向NULL,指针需要配合字符数组一起... -
C语言中的字符串以及求字符串长度
2020-08-12 05:48:46字符串的结束标志是一个\0的转义字符。 下来我们用两组代码演示/0的作用以及重要性。 #include<stdio.h> int main() { char arr1[] = "abcdef"; //字符串定义,默认结束时带\0 char arr2[] = { 'a', 'b',... -
关于C语言中字符串以‘\0‘结尾的原因
2020-11-25 16:54:32使用‘\0’来表示字符数组的结束 -
汇编语言统计字符串的长度
2020-01-15 21:58:30在数据段定义一个字符串首地址为String,该字符串以”$”作为结束标志,长度不超过100个字节,统计该字符串的长度并存入Len的内存单元。 data segment String db 100,?,100 dup('$') Len db 0 data ends code ...