• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

c语言数组长度问题?

#include
int main(int argc, char *argv[])
{
char s[]={0};
int a;
s[0]='a';s[1]='b';s[2]='c';
a=sizeof(s);
printf("%d",a);
return 0;
}
问题

  • 为什么我这样子输出为1?
  • 如果我想得到输出结果为三该怎么改?

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与3

内容太长,我另写一个回答:


对于不确定将要存储多少个字符的情形,你只能先定义一个足够长的数组,比如char s[256];
在接受输入时不要用那种可以一次性存入一串字符的函数(如scanf("%s", s)),因为你不知道会有多少个字符被输入,用户输入的字符串可能会超过数组的大小,这会导致“溢出”,这是很典型的错误和安全隐患。
应该一个字符一个字符地接受输入,比如用for循环getchar(),同时要记下已经输入的字符个数,如果超范围了就停止接受输入(并提示用户输入超长...之类的)。 最后别忘了在字符串尾加上'\0'('\0'是字符串结束的标志)
输入完毕后,你可以用strlen 之类的函数算出有多少个字符。或者你也可以自己算:从数组开头开始数,直到遇到'\0'。



关于 sizeof:
注意!它不是函数,它是个操作符。它会返回操作数占用内存的大小(以byte为单位,类型是size_t)
sizeof有两种用法:

  • sizeof 变量名 :得到的是这个变量占用内存的大小
  • sizeof (类型名) :得到的是这个类型占用内存的大小




sizeof后接的如果是个数组名,就会返回整个数组占用的内存大小。
比如在你的代码中,sizeof s 就返回1,因为你的s只有一个char元素,一个char元素占一字节。
如果char s[256],那么sizeof s 就返回 256 * char占用字节数 = 256。 所以你不能用 sizeof s 来求得 s 中有多少个字符,s中也许只存了5个字符,但 sizeof 得到的是整个 s 数组的大小。你只能用 strlen 之类的方法来得到实际字符数。


P.S. 准确地说,sizeof的第一个用法中,sizeof后接的不仅是变量名,而是后接一个表达式(变量名也算表达式的一种)。

使用道具 举报

想得到3你可以这样

  • 直接定义数组的时候char s[]={'a','b','c'};或是char s=“a,b,c”
  • 接着学,会有动态数组的教程,比较少用
  • 还会有string 类型,一般的字符数组都用string类型,后面char很少用了

使用道具 举报

数组的大小在定义时就确定了。
你在定义数组s时没有指定大小,那么编译器会根据你提供的初始化列表的元素个数来决定数组的大小。
而你用的是{0}(只有一个元素0),所以s数组只含有这一个元素0,sizeof s就是一个char的大小1。


因为数组的大小是固定的,你向 s[1] s[2] 中赋值也不会使数组扩大,并且这样访问是越界的,这种代码很不安全。


你想得到结果为3,那就在定义数组时指明其大小为3就好了:char s[3]

使用道具 举报

发新帖

发布任务需求已有1031289位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!