字符数组和字符串的sizeof( )和strlen()

字符数组和字符串的sizeof( )和strlen()
字符数组和字符串的sizeof( )和strlen()

目录

一、数组或字符串的长度

1、sizeof()---求所占的字节数

(1)、对于整型字符型数组

(2)、对于整型或字符型指针

2、strlen()---字符数组或字符串所占的字节数

(1)、针对字符数组

(2)、针对字符指针

3、sizeof()与strlen()区别

4、c++中的字符串string的长度

一、数组或字符串的长度

1、sizeof()---求所占的字节数

(1)、对于整型字符型数组

int A[]={1,4,5,2,8,6,0};

//求整型数组A所占的字节数

int i=sizeof(A); //i表示整型数组A所占的总空间的字节数

cout<<” i=sizeof(A)= ”<

i=sizeof(A)/sizeof(int); //此时i表示数字数组的元素个数

char B*+=,‘a’,’e’,’s’,’r’,’q’};

//求字符数组的所占的字节数

i=sizeof(B);

cout<

//求字符数组的元素个数

i=szieof(B)/sizeof(char); //结果为5

char C*+=”abcde”;

i=sizeof(C); //i为字符数组C所占的字节空间,为6,最后一个为’\0’

cout<

(2)、对于整型或字符型指针

int *p;

int A[]={1,2,3,4,5,6,7,8};

p=A;

inti=sizeof(*p); //此时i就是p所指的整型数组A的第一个元素A[0]的所占字节数 cout<

i=sizeof(P); // p为整形指针,大小为定值为4

cout<<*p<

cout<

char *p;

char B*+=,‘a’,’s’,’e’,’r’-;

p=B; //字符指针赋值,或char *p=B;这样为字符指针初始化赋值

i=sizeof(p); //p为字符指针,指针的大小为定值,为4

cout<

i=sizeof(*p); //这是指B[0]所占空间的大小

cout<

注意:

cout<<*p<

cout<

cout<

cout<

2、strlen()---字符数组或字符串所占的字节数

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

--就是指实际字符串或字符数组的实际长度(不是所占空间的字节数)。

(1)、针对字符数组

char A[6]={'a','b','\0','d','e','r'};

inti=strlen(A); //i为2,因为到’\0’结束,故实际A[]只有2个元素

cout<

char *str="abcde";

i=strlen(str); //i为5

cout<

//char A[6]={"abcdef"}; //error C2117: 'abcdef' : array bounds overflow

(2)、针对字符指针

char C[]={"abcdef"};

char *p1=C;

i=strlen(p1); //结果为6

cout<

char D[]={'a','c','q','f','w'};

i=strlen(D); //这样,由于没指定D的内存分配大小,用strlen求其长度会造成错误。

//如果为char D[5]={'a','c','q','f','w'};这样再用strlen求其长度也会造成错误,当D[]之中的数//大于5才不会造成错误。

cout<

(3)、针对其他结构

class X

{

inti;

int j;

char k;

};

X x;

cout<

cout<

解释一下,在class X中,成员中最大的所占的空间为int类型所占的空间4个字节,故内存补齐,最后结果为: ((int)(实际成员所占内存空间的和/4)+1)*4

(4)、有关空类

一个空类占多少空间?多重继承呢?

可以自己编写一个程序简单测一下:

#include

using namespace std;

class A

{

};

class A2

{

};

class B:public A

{

};

class C:public virture B

{

};

class D:public A,public A2

{

};

int main()

{

cout<<"sizeof(A): "<

cout<<"sizeof(B): "<

cout<<"sizeof(C): "<

cout<<"sizeof(D): "<

return 0;

}

结果:1 1 4 1

表明空类所占空间为1个字节,单一继承的空类空间也为1,多重继承的空类空间还是1,但虚继承涉及虚表(虚指针),所以sizeof(C)为4。

3、sizeof()与strlen()区别

sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。

4、c++中的字符串string的长度

string str1=”xxxxx”;

inti=str1.length();

cout<<”i=str1.length()= ”<

i=tr1.size();

cout<<”str1.size()= ”<

对于c++中的size()和lengt()没有区别,下面是它们的代码

size_type __CLR_OR_THIS_CALL length() const

{ // return length of sequence

return (_Mysize);

}

size_type __CLR_OR_THIS_CALL size() const

{ // return length of sequence

return (_Mysize);

}

为了兼容等,这两个函数一样。

length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。

string类的size()/length()方法返回的是字节数,不管是否有汉字。

C语言程序设计实验答案数组、指针与字符串

实验06 数组、指针与字符串(4学时) (第6章数组、指针与字符串) 一、实验目的 二、实验任务 6_1(习题6-25)编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。 6_2(习题6-26)使用动态内存分配生成动态数组来重新完成上题(n阶方阵),使用指针实现函数的功能。 6_3 编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 6_4 使用string类声明字符串对象,重新实现上一小题。 6_5(习题6-27)声明一个Employee类。 其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。 6_6(习题6-27)声明包含5个元素的对象数组,每个元素都是Employee 类型的对象。 6_7 修改实验4中的people(人员)类。 具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”声明为一个“日期”类内嵌子对象。 用成员函数实现对人员信息的录入和显示。 要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。 在测试程序中声明people类的对象数组,录入数据并显示。

三、实验步骤 1.(编程,习题6-25)编写矩阵转置函数,输入参数为3×3整型数组。 使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入输出。程序名:lab6_1.cpp。 参考运行结果: ★程序及运行结果: //lab6_1.cpp #include using namespace std; void move(int matrix[][3]){ int temp; for(int i=0;i<3;i++) for(int j=0;j>mat[i][j]; } cout<<"\n输入的3×3矩阵为:"<

第二章习题-ddg

第二章习题答案 1.给出以下概念的解释说明。 真值机器数数值数据非数值数据无符号整数带符号整数 定点数原码补码变形补码溢出浮点数 尾数阶阶码移码阶码下溢阶码上溢 规格化数左规右规非规格化数机器零非数(NaN) BCD码逻辑数ASCII码汉字输入码汉字内码机器字长 大端方式小端方式最高有效位最高有效字节(MSB) 最低有效位 最低有效字节(LSB) 掩码算术移位逻辑移位0扩展 符号扩展零标志ZF 溢出标志OF 符号标志SF 进位/借位标志CF 2.简单回答下列问题。 (1)为什么计算机内部采用二进制表示信息既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制或八进制数 (2)常用的定点数编码方式有哪几种通常它们各自用来表示什么 (3)为什么现代计算机中大多用补码表示带符号整数 (4)在浮点数的基数和总位数一定的情况下,浮点数的表示范围和精度分别由什么决定两者如何相互制约 (5)为什么要对浮点数进行规格化有哪两种规格化操作 (6)为什么有些计算机中除了用二进制外还用BCD码来表示数值数据 (7)为什么计算机处理汉字时会涉及到不同的编码(如,输入码、内码、字模码)说明这些编码中哪些用二进制编码,哪些不用二进制编码,为什么 3.实现下列各数的转换。 (1)10= ()2= () 8= () 16 (2) 2 = ()10= () 8= () 16= () 8421 (3)(0101 1001 8421 = ()10= () 2= () 16 (4)16 = ()10= () 2 4.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码表示。 +,–,+,–,+,–,+0,–0 5.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。 +1001,–1001,+1,–1,+10100,–10100,+0,–0 6.已知 [x]补,求x (1)[x]补= (2)[x]补= (3)[x]补=01010010 (4)[x]补= 7.某32位字长的机器中带符号整数用补码表示,浮点数用IEEE 754标准表示,寄存器R1和R2的内容分别为R1:0000108BH,R2:8080108BH。不同指令对寄存器进行不同的操作,因而不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少 (1)无符号整数加法指令 (2)带符号整数乘法指令 (3)单精度浮点数减法指令 8.假定机器M的字长为32位,用补码表示带符号整数。表中第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。 表题8用表

C语言字符串指针问题

C语言字符串指针问题 在C语言中,可以用两种方法访问一个字符串。 用字符数组存放一个字符串,然后输出该字符串。 1.main(){ 2.char string[]=”I love China!”; 3.printf("%s\n",string); 4.} 说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。 用字符串指针指向一个字符串。 1.main(){ 2.char *string=”I love China!”;

3.printf("%s\n",string); 4.} 字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。对指向字符变量的指针变量应赋予该字符变量的地址。如: char c,*p=&c; 表示p是一个指向字符变量c的指针变量。而: char *s="C Language"; 则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。程序中的:char *ps="C Language"; 等效于: char *ps; ps="C Language"; 输出字符串中n个字符后的所有字符。 1.main(){ 2.char *ps="this is a book";

3.int n=10; 4.ps=ps+n; 5.printf("%s\n",ps); 6.} 运行结果为: book 在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。 在输入的字符串中查找有无‘k’字符。 1.main(){ 2.char st[20],*ps; 3.int i; 4.printf("input a string:\n"); 5.ps=st; 6.scanf("%s",ps); 7.for(i=0;ps[i]!='\0';i++) 8.if(ps[i]=='k'){ 9.printf("there is a 'k' in the string\n"); 10.break; 11.} 12.if(ps[i]=='\0') printf("There is no 'k' in the string\n");

strlen,strcat,strcpy,strncpy,strcmp函数的比较

一、s trlen函数 strlen()函数用来计算字符串的长度,其原型为: unsigned int strlen (char *s); 【参数说明】s为指定的字符串。 strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0"。 【返回值】返回字符串s 的字符数。 注意一下字符数组,例如 char str[100] = "https://www.360docs.net/doc/1f6567265.html,/cpp/u/biaozhunku/"; 定义了一个大小为100的字符数组,但是仅有开始的11个字符被初始化了,剩下的都是0,所以 sizeof(str) 等于100,strlen(str) 等于11。 如果字符的个数等于字符数组的大小,那么strlen()的返回值就无法确定了,例如 char str[6] = "abcxyz"; strlen(str)的返回值将是不确定的。因为str的结尾不是0,strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的。 注意:strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。 如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。 二、s trcat函数 strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src); 【参数】dest 为目的字符串指针,src 为源字符串指针。 strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个NULL。 注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。

C语言字符串的输入和输出

C语言字符串的输入和输出 字符串的输入和输出 %c人为加入\0进行输入输出 %s直接输入输出 *输入输出字符串时字符数组应有足够的存储空间,指针变量作为输入项时,指针必须已经指向确切的、足够大的存储空间 %s的使用 scanf("%s",地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 例:char str[15]; scanf("%s",str); abc123 1.不读入空格和回车,从空格处结束 2.输入字符串长度超过字符数组元素个数,不报错 3.当输入项为字符指针时,指针必须已指向确定的有足够空间的连续 存储单元 4.当为数组元素地址时,从此元素地址开始存放 2.printf("%s",地址值) 输出时遇到第一个'\0'为止 3.gets和puts函数 开头必须stdio.h #include"stdio.h"

1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 4.当为数组元素地址时,从此元素地址开始存放 5.printf("%s",地址值) 输出时遇到第一个'\0'为止 6.gets和puts函数 开头必须stdio.h #include"stdio.h" 1.gets(地址值) 地址值:字符数组名、字符指针、字符数组元素的地址 7.例: char str[10]; gets(str); 包括空格符 8. 2.puts(字符串起始地址) 遇第一个'\0'结束,自动加入换行符 9.字符串数组:数组中每个元素都是一个存放字符串的数组 可以将一个二维数组看作是字符串数组 10.char ca[3][5]={"A","BB","CCC"}; A\0 B B\0 C C C\0 字符型指针数组 char*pa[3]={"a","bb","ccc"}; pa[0]pa[1]pa[2] 可以重新赋值gets(pa[2]);

sizeof()用法汇总

sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int); 对于静态数组,sizeof可直接计算数组大小; 例:int a[10];char b[]="hello"; sizeof(a)等于4*10=40; sizeof(b)等于6; 注意:数组做型参时,数组名称当作指针使用!! void fun(char p[]) {sizeof(p)等于4} 经典问题: double* (*a)[3][6]; cout<

第七章字符数组与指针练习题参考答案

第七章字符数组与字符串 【题7.29】下面是对s的初始化,其中不正确的是。 A)char s[5]={“abc”};B)char s[5]={‘a’,‘b’,‘c’}; C)char s[5]=“”;D)char s[5]=“abcdef”; 【题7.30】下面程序段的运行结果是。 char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’}; printf(“%s”,c); A)‘a’‘b’ B)ab C)ab c 【题7.31】对两个数组a和b进行如下初始化 char a[]=“ABCDEF”; char b[]={‘A’, ‘B’,‘C’,‘D’,‘E’,‘F’}; 则以下叙述正确的是。 A)a与b数组完全相同B)a与b长度相同 C)a和b中都存放字符串D)a数组比b数组长度长 提示:‘\0’是字符串结束的标志 【题7.32】有两个字符数组a、b,则以下正确的输入格式是。 A)gets(a,b); B)scanf(“%s %s”,a,b); C)scanf(“%s %s”,&a,&b);D)gets(“a”),get(“b”); 【题7.33】有字符数组a[80]和b[80],则正确的输出形式是。 A)puts(a,b); B)printf(“%s %s”,a[],b[]); C)putchar(a,b); D)puts(a),puts(b); 【题7.34】下面程序段的运行结果是。 char a[7]=“abcdef”; char b[4]=“ABC”; strcpy(a,b); printf(“%c”,a[5]); A)空格B)\0 C)e D)f 提示:复制后a[0]=‘A’,a[1]=‘B’,a[2]=‘C’,a[3]=‘\0’, a[4]=‘e’,a[5]=‘f’, a[6]=‘\0’,

求字符串长度

字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。常见的获取字符串长度的方法包括如下几种。 1.使用sizeof获取字符串长度 sizeof的含义很明确,它用以获取字符数组的字节数(当然包括结束符0)。对于ANSI字符串和UNICODE字符串,形式如下: 1.sizeof(cs)/sizeof(char) 2.sizeof(ws)/sizeof(wchar_t) 可以采用类似的方式,获取到其字符的数目。如果遇到MBCS,如"中文ABC",很显然,这种办法就无法奏效了,因为sizeof()并不知道哪个char是半个字符。 2.使用strlen()获取字符串长度 strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度,如: 1.size_t strlen( const char *string ); 2.size_t wcslen( const wchar_t *string ); strlen()与wcslen()采取0作为字符串的结束符,并返回不包括0在内的字符数目。 3.使用CString::GetLength()获取字符串长度 CStringT继承于CSimpleStringT类,该类具有函数: 1.int GetLength( ) const throw( ); GetLength()返回字符而非字节的数目。比如:CStringW中,"中文ABC"的GetLength()会返回5,而非10。那么对于MBCS呢?同样,它也只能将一个字节当做一个字符,CStringA表示的"中文ABC"的GetLength()则会返回7。 4.使用std::string::size()获取字符串长度 basic_string同样具有获取大小的函数: 1.size_type length( ) const; 2.size_type size( ) const;

字符数组和字符串的sizeof( )和strlen()

目录 一、数组或字符串的长度 1、sizeof()---求所占的字节数 (1)、对于整型字符型数组 (2)、对于整型或字符型指针 2、strlen()---字符数组或字符串所占的字节数 (1)、针对字符数组 (2)、针对字符指针 3、sizeof()与strlen()区别 4、c++中的字符串string的长度 一、数组或字符串的长度 1、sizeof()---求所占的字节数 (1)、对于整型字符型数组 int A[]={1,4,5,2,8,6,0}; //求整型数组A所占的字节数 int i=sizeof(A); //i表示整型数组A所占的总空间的字节数 cout<<” i=sizeof(A)= ”<

字符数组,字符指针,sizeof,strlen总结

[cpp] 字符数组,字符指针,sizeof,strlen总结 作者:Hui Wang来源:博客园发布时间:2011-03-26 14:22 阅读:728 次原文链接[收藏]对于字符数组与字符指针: 1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写"abc",那么编译器帮你存储的是"abc\0". 2. 字符串直接量作为字符指针的初始值 "hello"是一个字符串直接量,编译器将其作为const char*处理,与之相关联的内存空间位于内存的只读部分,即允许编译器重用指向等价字符串直接量的引用以优化内存使用, 即使程序中使用了字符串直接量500次,编译器在内存中也只是创建了一个实例。例如: char *ptr = “hello”; 等价于const char *ptr = “hello”; 字符串直接量"hello"关联的是只读内存,如果试图修改将出错,例如ptr[1] = …a?;是会引起错误的。 3. 字符串直接量作为基于栈的字符数组的初始值 由于基于栈的变量不可能引用其他地方存储的内存,编译器会负责将字符串直接量复制到基于栈的数组内存中。 例如: char stackArray[] = “hello”; 做如下修改: stackArray[1] = …a?;是真确的。 4. 字符数组与字符指针 字符数组的形式如下,会将字符直接量拷贝到栈上: char str[] = "abc"; // 实际的数据存储: a b c \0,也就是增加了一个终结符\0 char str[3] = {'a','b','c'}; // 实际的数据存储: a b c,并没有在最后添加终结符 char str[10] = {'a','b','c'}; // 实际的数据存储: a b c \0 \0 \0 \0 \0 \0 \0 字符指针的形式如下: char *str = “abc”;// 实际的数据存储: a b c \0,也就是增加了一个终结符\0 5. 类型的决定 1). 数组的类型是由该数组所存放元素的类型以及数组本身的大小决定的 如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。 2). 字符串常量的类型可以理解为相应字符常量数组的类型 如"abcdef"的类型就可以看成是const char[7],也就是说实际的数据存储为"abcdef\0"。 3). 函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型

C语言中的sizeof的理解

C语言中的sizeof的理解。。 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof(var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v)若此时char_v定义为char char_v[MAX]且MAX未知,sizeof(void)都不是正确形式。 三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。 2、int、unsigned int、short int、unsigned short、long int、unsigned long、float、double、long double类型的sizeof在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 4、当操作数具有数组类型时,其结果是数组的总字节数。 5、共用体类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof 是这种类型对象的总字节数。 让我们看如下结构: struct{char b;double x;}a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 四、sizeof与其他操作符的关系 sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。 五、sizeof的主要用途 1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: void*malloc(size_t size), size_t fread(void*ptr, size_t size, size_t nmemb, FILE*stream)。 2、sizeof的另一个的主要用途是计算数组中元素的个数。例如: void*memset(void*s, int c, sizeof(s))。

指针经典练习题及答案

二、程序题 1、计算字符串中子串出现的次数。要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。 2、加密程序:由键盘输入明文,通过加密程序转换成密文并输出到屏幕上。 算法:明文中的字母转换成其后的第4个字母,例如,A变成E(a变成e), Z变成D,非字母字符不变;同时将密文每两个字符之间插入一个空格。 例如,China转换成密文为G l m r e。 要求:在函数change中完成字母转换,在函数insert中完成增加空格, 用指针传递参数。 3、字符替换。要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E), 并返回替换字符的个数。 4、编写一个程序,输入星期,输出该星期的英文名。用指针数组处理。 5、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列, 再分别取出每个字符串的第三个字母合并成一个新的字符串输出 (若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。 6、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值, 然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。7、实现模拟彩票的程序设计:随机产生6个数字,与用户输入的数字进行比较, 输它们相同的数字个数(使用动态内存分配)。 /*1、计算字符串中子串出现的次数。要求:用一个子函数subString()实现, 参数为指向字符串和要查找的子串的指针,返回次数。*/ #include int subString(char *a, char *b) { int i = 0; int j = 0; int m = 0; char *p = b; while(*a) { while(*a) { if(*a == *b) { break; } a++; } while(*b) { if(*a != *b)

字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配

最近工作之余,发现了两个自己在C语言学习中的难点,一个是字符串指针和字符数组的区别,一个就是静态全局变量、静态局部变量、全局变量和局部变量的区别,在网上查了不少资料,收获良多,现在与大家分享,有错误的地方请大家指正! 以下程序用VC++6.0调试 先说说字符串指针和字符数组的区别 1.相同点: /* 用字符数组实现字符串操作*/ main( ) { char str[]="Welcome to study C !"; int i; printf("%s\n",str); for (i=0;i<=7;i++) printf("%c",str[i]); //用*(str+i)也行 printf("\n"); } /* 用字符指针实现字符串操作*/ main() { char *str="Welcome to study C !"; int i; printf("%s\n",str); for(i=0;i<=7;i++) printf("%c",*(str+i)); //用str[i]也行 printf("\n"); } 2.不同点: a)赋值方式不同,字符数组只能对各个元素分别赋值,而字符指针只需赋给字符串的 首地址就可以了。 如: char *str; str="Welcome to study C !"; 以下对字符数组的赋值是错误的: char str[80]; str[ ]="Welcome to study C !"; b)字符指针指向字符串,"hello"是一个字符串常量,与之相关联的内存空间位于内 存的只读部分,如: char ch[] = "china\n"; char *p; char *pp = "CHINA\n"; p = ch; *(p+2) = 'h';//就是可以的 *(pp+2) = 'h';//此处在编译时不会出错,在执行的时候会出错

C语言二级考前一个月复习概况

整数的三种表示形式 表示形式 组成 开头部分 十进制 D,或不加表示 0-9 以1-9开头 八进制 O 0-7 以0开头 十六进制 H 0-9,A-F 以0x 开头 int a[100],*p; 等价语句 p=a; P=&a[0]; 等价语句 p=a+1; P=&a[1]; 文本文件 二进制文件 使用方式 含义 使用方式 含义 r 打开文本文件进 行只读 rb 打开二进制文件进行只读 w 建立新的文本文件进行只写 wb 建立二进制文件进行只写 a 打开文本文件进 行追加 ab 打开二进制文件进行追加/写 R+ 打开文本文件进 行读/写 Rb+ 打开二进制文件进行读/写 W+ 建立新的文本文件进行读/写 Wb+ 建立二进制文件进行读/写 A+ 打开文本文件进行读/写/追加 Ab+ 打开二进制文件进行读/写/追加

指针是以地址作为其值的变量,数组名的值是一个特殊的固定地址,可以作为常量指针。 类型 名称 类型名 数据长度 整型 整型 Int 32位 短整型 Short int 16位 长整型 Long int 32位 字符型 字符型 Char 8位 实型(浮点型) 单精度浮点型 float 32位 双精度浮点型 double 64位 函数 数据类型 格式 printf float %f double %e scanf float %f %e double %lf %le 字符串的输入和输出 输入 Scanf() 该函数遇到空格或回车输入结束 Gets() 该函数遇到回车符输入结束 输出 Printf() 输出时遇到’\0’输出结束 Puts() 输出时遇到’\0’输出结束 运算符 优先级 结合方式 优先级:高->低 逻辑运算符 ! 右->左 算术运算符 ++ -- + - * 右->左 * / % + - 左->右 关系运算符 <= < >= > == != 左->右 逻辑运算符 && || 左-> 右 条件表达式 ?: 右->左 赋值运算符 *= /= %= += - = = 右->左

第8章 指针-3字符数组和字符指针 - 字符串的表示与存储

第8章指针——字符数组与字符指针:字符串的表示与存储

printf("How are you"); H o w a r e y o u \0

printf("How are you.\n "); printf("\"How are you.\"\n"); How are you. _ printf("How are you. Press \ a key and then press Enter:\n"); How are you. Press a key and then press Enter: _ "How are you." _ printf("How are you. Press " "a key and then press Enter:\n"); 问题:如果字符串太长,怎么表示?

?C语言没有提供专门的字符串数据类型 ?字符数组——每个元素都是字符类型的数组 H o w a r e y o u 0 H o w a r e y o u \0

?字符数组的定义 #define STR_LEN 80 char str[STR_LEN+1]; ?字符数组的初始化 用字符常量的初始化列表对数组初始化 char str[6] = {'C','h','i','n','a','\0'}; 用字符串常量直接对数组初始化 char str[6] = {"China"}; char str[6] = "China"; char str[ ] = "China"; char char str[10] = "China";

?字符指针就是指向字符串首地址的指针 ?定义一个字符指针,使其指向一个字符串常量 H e l l o C h i n a \0

华清远见C补习测试题

Linux就业班C语言基础补习课程测验 日期:姓名分数 一、选择题下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。请 将正确的答案填在答题卷相应的位置。(每题2分,共30分) (1)以下关于C语言的叙述中正确的是 A)C语言中的注释只能出现在语句或表达式的两边 B)C语言中的变量可以在使用之前的任何位置进行定义 C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示 (2)以下叙述错误的是 A)一个C程序可以包含多个不同名的函数 B)一个C程序只能有一个主函数 C)C程序在书写时 有严格的缩进要求 否则不能编译通过 D)C程序的主函数必须用main作为函数名 (3)有以下程序 #include main() { int A=0,B=0,C=0; C=(A-=A-5); (A=B,B+=4); printf(“%d, %d, %d\n”,A,B,C); } 程序运行后输出的结果是 A) 0,4,5 B) 4,4,5 C) 4,4,4 D) 0,0,0 (4)有如下嵌套的if语句 if(ac) ? b:c); C) k=(a

sizeof深入理解(vcbase)

sizeof深入理解(vcbase) ? 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 拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len); } 有关内容见: C++ PRIMER? ?10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU 取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data

实验4(数组、指针、字符串)

实验二C++程序设计基础 一、实验目的 (1)、学习并掌握指针的性质 (2)、掌握指针参数的运用,进一步掌握引用的使用方法 (3)、学习函数指针的应用和带参数的main函数 (4)、学习掌握指针与引用、指针与数组、指针与字符串的用法 二、实验内容及步骤 1、选择题 (1)已知一函数的形参说明为int arr[5][6],在下列说明中,与此等效的形参说明为__________。 A. int arr[][] B. int [5][] C. int *a[6] D. int (* a)[6] (2)已知函数f的原型是:int f(char a,char * b=NULL,double c=0.0); 则下列调用中,不能正确地调用f函数的是__________ 。 A. f(99) B. f(‘A’,4.5) C. f(‘A’,”123”) D. f((char)65,”123”) (3)已知函数f的原型为:void f(int &a,char *b); 变量s,t的定义是:int s; char t[]=”ABCD”;把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是:__________ 。 A. f(&s,&t); B. f(&s,t); C. f(s,t); D. f(s,&t); (4)若指针p定义为const char *p="Luchy!"; 则[ ]。 A) p所指向的数据不可改变,p在定义时可以不初始化。 B) p所指向的数据不可改变,p在定义时必须初始化。 C) p本身不可改变,p在定义时可以不初始化。 D) p本身不可改变,p在定义时必须初始化。 (5)已知数组A和指针p定义为:int A[20][10],*p;,要使p指向A的首元素,正确的赋值表达式是[ ]。 A) p=&A 或p=A[0][0] B) p=A 或p=&A[0][0] C) p=&A[0] 或p=A[0][0] D) p=A[0] 或p=&A[0][0] (6)已知函数func的原形是 double func(doouble *pd,int &ri); 变量x和y的定义是 double x; int y; 把x和y分别作为第一参数和第二参数来调用函数func,正确的调用语句是[ ]。 A) func(x,&y); B) func(&x,y); C) func(&x,&y); D) func(x,y); (7)若指针p定义为char * const p="Luchy!"; 则[ ]。 A) p所指向的数据不可改变,p在定义时可以不初始化。 B) p所指向的数据不可改变,p在定义时必须初始化。

指向字符串的指针数组

在初学习C语言时,对于指针是最容易让人迷糊的,尤其对于指针数组,而且是指向字符串的指针数组,恐怕就更难理解了。下面本人给出一个例子,详细讲解指向字符串的指针数组的使用情况。希望给予学习C的朋友一点帮助。 下述程序执行后,输出结果是什么? #include char *p[2][3]={ "abc","defgh","ijkl","mnopqr","stuvw","xyz"}; main(){ printf("%c\n",***(p+1)); printf("%c\n",**p[0]); printf("%c\n",(*(*(p+1)+1))[4]); printf("%c\n",*(p[1][2]+2)); printf("%s\n",**(p+1)); } 答案是: m a w z mnopqr 答案解析: 这里相当于定义了2行3列共6个元素的数组,数组的每一个元素都是指向字符的指针变量。 其中p[0][0]指向串"abc",p[0][1]指向串"defgh",p[0][2] 指向串"ijkl",p[1][0]指向串"mnopqr",p[1][1]指向串"stuvw",p[1][2] 指向串"xyz"。 1、printf("%c\n",***(p+1)); 这里的***(p+1)相当于*(*(*(p+1)+0)+0),而*(*(p+1)+0)+0)的另一种容易懂的形式是p[1][0],在多维数组中这两种写法等价。如上面所写的p[1][0]是指向串"mnopqr",即保存的是串"mnopqr"的首地址,也即字母m的地址。因此***(p+1)是字母m 2、printf("%c\n",**p[0]); 这里的**p[0]等价于*(*(*(p+0)+0)+0),也即*(p[0][0]),而p[0][0])指向串"abc",所以*(p[0][0])是字符a 3、printf("%c\n",(*(*(p+1)+1))[4]); (*(*(p+1)+1))[4]等价于*((p[1][1])+4),而(p[1][1])指向串"stuvw",所以*((p[1][1])+4)是在串首向后移动4个单位的字符,也即w 4、printf("%c\n",*(p[1][2]+2)); 因为p[1][2]指向串"xyz",而p[1][2]+2 就是串首向后移动2个字节(一个字节保存一个字符),也就是指向字符z,所以*(p[1][2]+2)是字符z

相关文档
最新文档