10.24 下午 关于\0和字符数组

发布于 2024-10-24  214 次阅读


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

  1. 字符串的定义:在 C 语言中,字符串是以 '\0' 结尾的字符数组。比如,char ch[2] = "a"; 实际上在内存中存储的是 {'a', '\0'}
  2. strlen 函数strlen 函数返回的是字符串中实际字符的数量,不包括终止符 '\0'。因此,对于 char ch[2] = "a";strlen(ch) 返回 1

虽然strlen返回的不包括\0,但是数组是从下标0开始的,比如,确实'abc'是三个字节,是arr[ 3 ],而且strlen也会返回3,这就和数组溢出是一个道理了

string.h意思就是字符串,strlen用于计算字符串长度存在这里面,很合理

//char类型的变量就是一个字符,想要用%s那就得用char字符数组!!

届ける言葉を今は育ててる
最后更新于 2024-11-05