我遇到了关于使用函数strchr
的问题,我的代码是
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char linebuf[1000];
int main()
{
char linebuf[] = "sortie.bin:8276 bytes";
char *colonPos = strchr(linebuf,':'); // strchr returns the pointer of ":"
cout<<colonPos<<endl; // display: ":8276 bytes"
cout<<*colonPos<<endl; // display: ":"
cout<<linebuf<<endl; // display: "sortie.bin:8276 bytes"
*colonPos = 0;
cout<<linebuf<<endl; // display :"sortie.bin"
return 0;
}
我的问题是为什么:当我把*colonPos = 0
,linebuf更改以及&#34;之后的所有事情:&#34;被取消但我实际上并没有改变任何linebuf。
答案 0 :(得分:2)
colonPos
是指向:
中linebuf
个字符的指针。当您将:
替换为\0
时,您将&#34;截断&#34;字符串,因为C字符串是&#34; null终止&#34;按照惯例,它们在第一个零字节处停止。
如果将C字符串的第N个字符设置为\0
(零字节),则字符串最多为N个字符。这就是C字符串的定义方式。
答案 1 :(得分:0)
执行*colonPos = 0
时,您将数组修改为"sortie.bin\08276 bytes"
。也就是你用字符串终止符替换冒号,而替换是linebuf
的修改(或更改)。
答案 2 :(得分:0)
为operator <<
类型的流和对象重载的运算符char *
(在极少数例外的表达式中使用的字符数组被转换为指向其第一个元素的指针)输出字符,直到遇到零字符。也就是说,操作员认为字符数组包含C字符串。
如果要输出整个数组,则应使用方法write
。例如
#include <iostream>
#include <string>
#include <cstring>
int main()
{
char linebuf[] = "sortie.bin:8276 bytes";
size_t n = strlen( linebuf );
char *colonPos = std::strchr( linebuf,':' );
*colonPos = 0;
std::cout.write( linebuf, n ) << std::endl;
return 0;
}
程序输出
sortie.bin8276 bytes