c语言==字符数组与字符串,char的取值范围(1)

来源:互联网 发布:数控车梯形螺纹g92编程 编辑:程序博客网 时间:2024/05/22 06:50

求char类型数组的strlen长度

昨天老师给了一道题目
#include <stdio.h>#include "string.h"int main(){    int i;    char a[1000];    for(i = 0; i < 1000; i++)    {    a[i] = - i - 1;    }    printf("strlen(a)=%d\n", strlen(a));    return 0;}

当时心想这个答案不就是1000吗。我甚至想了1001,因为想到字符串有\0。

但是后来才意识到了这是要求的是strlen。1000的这个数组的sizeof。

sizeof求的是数组的空间容量,而strlen求的是数组的实际长度,有多少数字字符存储在里面。

上面说到\0 因为我现在大二 大一的时候没有好好学c语言,怎么都入不了门 现在再回顾的时候发现一些细节还是处理不好。

首先谈谈\0与strlen的关系。
strlen一遇到\0他就不会再继续下去了,所以他当然是不会去计算\0的个数的。
strlen("abcd\0ef\ng\0")
这个答案应该是4,因为他遇到第一个\0就自动停止了。只读了abcd。

再说说\0与sizeof的关系
sizeof是表示数组情况的,而字符数组在初始化的时候是不加’\0’的。所以sizeof不包括’\0’,只是输出初始化数据的数量


这里写图片描述
刚才为了这条题目花了好长时间。感觉要是自己平时不写博客。这些东西随随便便就放掉了。但是写博客的话感觉都要理清楚,似乎要写到宇宙起源2333。
首先我看到这个题目的时候我还是有点蒙圈的。因为不自信。看起来一样但是总感觉不是那么简单的。然后我就敲代码测试了一下。
发现什么呢,
a字符串不管加不加static,他的strlen是6,sizeof是7.
如果中括号硬要写数字,那么里面要写上7才能正确的存储赋进去的值。
b数组如果单单像图片上那样,sizeof=6,strlen是肯定得不到的,数组字符也不对。
有两种解决办法
1、加上static 所有的都bingo。sizeof=数据的数量
2、在数组里面加上’\0’,sizeof=数据的数量+1,字符串和strlen bingo.

百度了一下static,是为了兼容编译器还有分配静态存储空间什么的。但是还是不知道为什么加了他就能正确输出了,求大牛指点。

后来翻了一下课本,发现了一些不得了的东西。字符数组和字符串。
样子差不多,其实就差了个’\0’。有就是字符串,没有就是字符数组。

所以可以得出结论:
平常所说的a[n]

如果他作为一个字符数组
//字符数组都是外面大括号,里面的字符用单引号括起来
如char b[]={‘a’,’b’,’c’},这个时候你写了三个值进去了,

如果你中括号里不写任何东西,此时你求sizeof,它是=3的,strlen无法确定,你写进去的值也没办法好好输出。
如果你中括号写了3,它的sizeof毫无疑问是3,strlen无法确定,值也没办法输出
如果你中括号写了4,一切都是对的

所以如果他是作为字符数组的a[n],那么他的sizeof是n,strlen是……鬼知道呢,是你自己输入数据的长度,几个数 strlen就是几。如果中括号没n,则sizeof=数据的数量

但是他如果是作为字符串
//字符串两种表达方式,要么是双引号直接括起来,要么是外面大括号里面双引号。
如char a[]=”abc”,这个字符串有三个数

如果你中括号里不写任何数,那么他输出的sizeof是3+1,strlen是3,字符串也能好好输出。
如果你中括号写3 sizeof是3,strlen很混乱,字符串也不太好。哈哈意思就是他们都是错的。
如果中括号写4 输出的都是对的,sizeof=4,strlen=3,字符串也好好的。

所以字符串很乖,a[n]表示他有n-1个数字,strlen=n-1,sizeof=n,字符串是n-1个输出。如果没n,sizeof=数据的数量+1,strlen=数据的数量

Sizeof与Strlen的区别与联系(转)

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);
}

我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:

char str[20]=”0123456789”;
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

char* ss = “0123456789”;
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是

长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空间,是char类

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen


啊。绕了这么久,图片上的题目答案还没得出来。
首先感觉题目有点问题,a不是数组时字符串呀。要求长度就是字符串的长度就是strlen,那么就是6。b是一个字符数组。没有写上’\0’。求它的长度,那么就是sizeof了。也是6。我感觉应该是相等的,但是仅仅是个人意见。这个题目是百度别的东西的时候看到的,题主并没有给答案,求大牛指导。


啊,我以后肯定不能当老师,不然光扯了。可能上课抛的第一个问题都没回答呢。


接下来回答一下第一个困扰我的问题。

#include <stdio.h>#include "string.h"int main(){    int i;    char a[1000];    for(i = 0; i < 1000; i++)    {    a[i] = - i - 1;    }    printf("strlen(a)=%d\n", strlen(a));    return 0;}

为了方便,我就粘下来了。首先strlen的类型要是char类型的。char类型无符号数的范围是0-255,有符号型是-128~127
这道题目-i-1=127的话,i=-128,如果是-129,那么将超出127.
假如-i-1=-128的话,i=127,如果是128,那么将超出-128.
然后我的理解就是127+128.
意思就是谁的值是0,那么他的下标就是范围了。和这道题目类似的一道题目
里面有详尽的解释。

字符数组

形式是char a[] = {‘A’,’B’,’C’}

字符串

形式是char a[] = “abcd”或者是char a[] = {“abcd”}

字符串的初始化必须要加\0
char a[] = {‘a’,’b’,’c’,’\0’}

0 0
原创粉丝点击