永发信息网

输入一个未知长度的字符串数组 scanf

答案:1  悬赏:40  手机版
解决时间 2021-02-13 01:43
经常要用输入的时候,我都是这样定义的:
char string[1000];
scanf ( "%s", string );
因为我不知道到底要输入多长的字符串,所以我就设了一个非常大的数组下标
有没有什么办法,根据你输入的字符串长度,来定义数组的内存分配大小?因为你永远不知道到底要输入多长的字符串啊,如果输入的长度超过了我设定的下标,又会出错啊。
我之前尝试,比如
char string[];
scanf ( "%s", string );

char *string;
scanf ( "%s", string );
都会出错。
所以,一直找不到一好个办法。
最佳答案
scanf函数是可以限制输入长度的,但scanf("%s",a)这种写法没有使用它的限制功能,所以是不检查字符串长度;C/C++也是不检查数组越界的。防止数组越界的任务完全由程序员事先安排完成;越界了就会产生不良或危险后果,正规软件中是绝对不能允许的。正因为“不检查”,当越界操作数组时,在越界部分没有受到“其他干扰”的情况下自然也能“正常”表现。你这里的问题是:要弄清操作符sizeof和函数strlen的意义:操作符sizeof是求参数的内存分配字节数,你这里为a分配了3个字节,所以输出是3;而函数strlen是求字符串长度,从字符串第一个字符开始,一个一个往后数,直到遇到'\0'为止看经过了多少个字符,有几个字符,输出就是几(不包括'\0')。scanf在接收字符串时最后要自动加一个'\0',所以在6个A后有个'\0',所以strlen计算出来是6。但有一点要说明,那就是你的运气好:因为你声明的长度是3,输入长度却是6,3个后面的字符是不可靠的,说不定被别人占用了它们所在的空间,那就不知道在什么地方才能“碰到“'\0',那样的话由strlen计算出来的长度也就可能是个大于等于3的任何数……
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
恶女阿楚最后汪芷儿爱上谁?
怪物猎人3的携带版怎么存档啊??
杭州125路多久发一班车
假面骑士drive中001身份曝光是第几集
中交·丽景地址在什么地方,想过去办事
eGG眼镜(蓝色港湾店)地址在什么地方,我要处
高考英语 语音题 是考美式的还是英式的
整车喷漆算几个面,有没有好心的车友帮帮忙?
妮飘黑郁薄荷的纸巾是什么味道
帝豪EC7如何贷款买车首付多少钱还贷每月多少
98水浒传第3集鲁智深
娇字开头的成语接龙
木九十(蓝色港湾店)地址有知道的么?有点事想
请问,华硕Z270 I7 7700K平台怎么装W7.读不了
中心寄卖行我想知道这个在什么地方
推荐资讯
请问去澳大利亚旅行买什么纪念品回国内送朋友
旺旺经营部在哪里啊,我有事要去这个地方
单选题下列句子中没有语病的一项是A.《众志成
晚上和媳妇亲热时候 一个姿势 不太 敏感 但是
阿尔曼理发店地址好找么,我有些事要过去
六普大厦-停车场地址在什么地方,想过去办事
取金为用神,水为喜神
中国建设银行轻工市场储蓄所怎么去啊,我要去
中国建设银行支行 工资待遇怎么样 比如淄博
紫金书店在什么地方啊,我要过去处理事情
朋友的公司说网站上线是什么意思
预焙阳极块的氧化面范围、指标是什么?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?