字符串函数strlen()用于计算字符串中的字符数(包括空格和标点符号)。但并不包括字符串末尾的空字符'\0' ,而sizeof()则是计算字符串占用的内存空间,所以它是连同字符串末尾的空字符一同计算的。
1、有以下代码
char str1[40]="hello nowcoder";
printf("strlen(str1)=%d\n",strlen(str1)); //14
printf("sizeof(str1)=%d\n",sizeof(str1)); //40
符合常规推论结果,字符串“hello newcoder”有5+8个字母+1个空格,共计14个字符,而系统自动为str2分配了40个字节的空间。
2、有以下代码
char str2[]="hello nowcoder";
printf("strlen(str2)=%d\n",strlen(str2)); //14
printf("sizeof(str2)=%d\n",sizeof(str2)); //15
符合常规推论结果,字符串有14个字符,而系统为str2分配了15个字节的空间,多出来的空间即为空字符'\0'所占用。
3、有以下代码
char str[40]={0};
fgets(str, sizeof(str), stdin); //输入hello newcoder‘回车’
printf("strlen_str=%d\n",strlen(str)); //15
printf("sizeof_str=%d\n",sizeof(str)); //40
puts(str); //hello newcoder
printf("hello!");
//程序界面:
hello newcoder //键盘输入
strlen_str=15
sizeof_str=50
hello newcoder
hello!
此时,使用fgets()函数通过屏幕输入字符串后,字符串字符数strlen()函数返回值增加了1,而使用puts()函数输出的跟键盘输入的无区别,仍是"hello newcoder"。底下加一句printf()函数用于查看换行符情况。
4、这样对比还不太明显,我们调整代码:
char str[5]={0};
fgets(str, sizeof(str), stdin);
printf("strlen_str=%d\n",strlen(str));
printf("sizeof_str=%d\n",sizeof(str));
puts(str);
printf("hello!");
//程序界面:
abcdefghijk //键盘输出
strlen_str=4
sizeof_str=5
abcd
hello!
可知,使用fgets()函数通过键盘输入时,若字符串终止条件是换行符,会自动把换行符放置在字符串的末尾,且输出打印时,会将换行符打印出来,若字符串终止条件不是换行符,而是按分配空间用完为结尾,则字符串的末尾是空字符'\0',此时换行符没有被写入字符串中。
第一种情况下,我们范围字符串末尾换行符属于数组越界行为。故在使用fgets()函数录入的字符串中(给配的空间足够,以换行符结尾),
5、访问最后一个字符的正确方式是
char str[5000]={0};
char *p_str;
p_str=str;
fgets(str, sizeof(str), stdin);
if(strlen(str)==0){printf("%d\n",0);return 0;}
p_str=p_str+strlen((str))-1-1; //访问最后一个字符,减去1、从0技术;2、换行符
即比常规直接初始化多减一个换行符。