关于字符串结尾含换行符的问题

字符串函数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、换行符

即比常规直接初始化多减一个换行符。

C++ 中,你可以使用 `std::getline` 函数从标准输入流(通常是键盘)读取字符串,直到遇到换行符为止,并将其存储到字符数组(如 `std::string` 或者字符数组 `char str[]`)中。这里是一个基本的例子: ```cpp #include <iostream> #include <string> std::string readStringFromUser() { std::string str; std::cout << "请输入一个以换行符结尾字符串: "; std::getline(std::cin, str); // 使用 getline 读取直到换行符('\n') return str; // 返回读取的字符串 } int main() { char input[100]; // 如果你想使用字符数组,记得给它足够大的空间 // 注意,字符数组需要手动添加 '\0' 作为结束标志 std::getline(std::cin, input, '\n'); // 在这里,getline 不会自动添加 '\0',你需要在适当位置手动添加 // 如果使用字符数组,还需要手动检查是否已达到最大长度并添加 '\0' if (input[strlen(input) - 1] != '\0') { input[strlen(input)] = '\0'; // 添加 '\0' } std::string userStr = readStringFromUser(); // 或者直接将上面两行替换为这一行,如果不需要字符数组的话 // std::string userStr = "这是一个以换行符结尾字符串"; // 打印或进一步处理用户输入的字符串 std::cout << "你输入的字符串是: " << userStr << std::endl; return 0; } ``` 在这个例子中,`std::getline` 用于读取用户输入,并会在遇到换行符时停止。对于字符数组,记得手动添加终止符 `'\0'`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值