c语言week8

2-1.下面哪一项是不正确的字符串赋值或赋初值的方式( )。 C

A. char *str; str="string";

B. char str[7]={'s','t','r','i','n','g'};

C. char str1[10];str1="string";

D. char str1[]="string",str2[]="12345678";

C是初始化一个含有6个字符的字符数组。B虽然也是初始化了6个元素,但是B一共有7个元素,所以最后一个元素编译器会自动填字符'\0',这就构成了一个字符串。所以B也是一个字符串赋初始值。A和D显然是对的。 所以,C是不正确的字符串赋值。

str1,数组名是一个地址常量,不是变量,不能作为左值被赋值。、、、、、、、、、、、、、

2-2.以下定义语句中不正确的是_B_。

A.double x[5]={2.0, 4.0, 6.0, 8.0, 10.0};

B.char c2[]={'\x10', '\xa', '\x8'};

C.char c1[]={'1', '2', '3', '4', '5'};

D.int y[5]={0,1,3,5,7,9};

在一位数值中要注意的是作为下标表达式的常量表达式的值必须是大于等于0,别且小于自身。

2-3.对于定义 char str[] = "abc\000def\n"(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (2分)(2)

12 ,13
3 ,11
3 ,9
3 ,4
 1.数组长度的计算:整形数组大小:sizeof(数组名)/sizeof(数组类型)。 字符数组大小:strlen(数组名)+1,1因为要加上'/0',所以     再加1.

 2.字符串长度的计算:

字符串长度是指字符串所含的字符个数,但不包括最后的'\0'。sizeof(str)

C语言的字符串是由字符数组形式保存的,并约定'\0'(ascii码值为0)作为字符串结束符。其长度为从字符串开始,到'\0'结束,所有字符的个数,不包括'\0'本身。

"abcd\n" -------长度应该为5(\n转义符) ,转义字符也算一个字符的。

1、c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)。例如:

1

2

3

4

int data[4];

int length;

length=sizeof(data)/sizeof(data[0]);  //数组占内存总空间,除以单个元素占内存空间大小

printf("length of data[4]=%d", length ); //输出length of data[4]=4

2、但是,通过传递数组名参数到子函数中,以获得数组长度是不可行的。

例如:

1

2

3

4

5

int getLength(int[] a){

    int length;

    length=sizeof(a)/sizeof(a[0]); //这样是错误的,得到的结果永远是1

    return length;

}

因为,a是函数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址),所以,sizoef(a)的结果是指针变量a占内存的大小,一般在32位机上是4个字节。a[0]是int类型,sizeof(a[0])也是4个字节,所以,结果永远是1。3、因此,获得数组长度,只能在数组定义所在的代码区中,采用以上方法,才可以达到效果。

* strlen用来求字符串的长度用的
  而sizeof是用来求指定变量或者变量类型等所占内存大小用的(需要加上'\0'的位置)
  比如strlen("nihao")它的结果是5
  而sizeof(int)它的结果是2也就是说int型占两个字节

#include<stdio.h>
#include<string.h>
int main(){
    int m,n;
    m=sizeof("abc\000def\n");
    n=strlen("abc\000def\n");
    printf("%d %d",m,n);

运行结果是9 3 (注:\000和\00和\0所占的内存是一样的(疑问)

只有计算字符长度时不许考虑'\0'
 

2-4.下面描述正确的是D

A.两个字符串所包含的字符个数相同时才能比较字符串

B.字符个数多的字符串比字符个数少的字符串大

C.字符串“ STOP”和“STOP”相等

D.字符串“That”小于字符串“The”

答案是D。

A和B选项:比较字符串并不在乎两个字符串的长度,而是逐个比较两个字符串中的字符的ASCII值,若相等则继续比较,否则返回两个字符ASCII值的差。

C选项:两个字符串不会相等,因为它们保存在不同的地址,只有字符串的值才会相等。

D选项:正确,而且返回-4,因为'a' - 'e'为-4。

字符串串接是结合性的,但非交换性运算。空串充当单位;对于任何字符串 s,有 εs = sε = s。所以,集合 Σ* 和串接运算形成了幺半群,就是从 Σ 生成的自由幺半群。此外,长度函数定义从 Σ* 到非负整数的幺半群同态

2-5.有两个字符数组a,b,则以下正确的输入语句是()

A.gets(a,b);

B.scanf("%s%s",a,b);

C.scanf("%s%s",&a,&b);

D.gets("a"),gets("b");

a,因为a,b本身就是个地址值所以不用&符号取地址。而gets用法错误。应该为gets(a);gets(b);

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值