int n = 0;
char* arr = malloc(n + 1);
由于n初始化为0,malloc(n + 1)
在 n
为 0 时只分配了 1 字节的内存,这个字节将用于存储 \0
。这样,当你尝试在 arr[0]
中存储第一个字符时,实际上没有足够的空间来存储字符和结束符
所以,定义时arr[ ]括号里面填1,意味着你没有空间,因为必定有的\0将占用这1个字节
如果你希望在输入结束时不需要按回车,可以考虑使用其他输入方式,比如 fgets
,但这可能不符合你的需求
如果你希望在输入时遇到空格或换行符就中止输入,可以使用 scanf ,同上比之,此法更优,但会涉及很多知识
char arr[1]={ 0 };
//这种代码就相当于把数组arr的内存大小固定死了,与动态分配对立
题目:写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)
这道题的新颖之处在于没有给你减小难度,没有让你提前写好要输入的字符串的长度
此类问题,我们不必使用fgets,因为它需要以空格或者回车作为输入中止的标准;因为它需要连续输入直到空格或回车停止,所以你不能使用scanf中字符串%c(它需要空格或回车);所以你得使用%s(不需要动态分配,徒增麻烦),同时借助strlen函数
因为后期需要反序,绝对需要用到数组,而数组如何使用%s去实现输入?答案是定义一个char类型的数组
字符串和 strlen
- 字符串的定义:在 C 语言中,字符串是以
'\0'
结尾的字符数组。比如,char ch[2] = "a";
实际上在内存中存储的是{'a', '\0'}
strlen
函数:strlen
函数返回的是字符串中实际字符的数量,不包括终止符'\0'
。因此,对于char ch[2] = "a";
,strlen(ch)
返回1
虽然strlen返回的不包括\0,但是数组是从下标0开始的,比如,确实'abc'是三个字节,是arr[ 3 ],而且strlen也会返回3,这就和数组溢出是一个道理了
string.h意思就是字符串,strlen用于计算字符串长度存在这里面,很合理
//char类型的变量就是一个字符,想要用%s那就得用char字符数组!!
Comments NOTHING