c/c++ 处理字符串时要注意的问题

c/c++ 处理字符串时要注意的问题。

最近在写一个文件操作的时候,出现了一点儿问题。虽不是大问题,但是不注意的话会产生错误。

写了一个块读取的方法。

从inf 流中,最多读取num个字符,保存在buf中,并返回读取字符数。


int readFromStream(ifstream &inf, char *buf, int num)
{
    //cout<<"her"<<endl;
    int cnt = 0;
    // (1) while(! inf.fail() && cnt < num - 1)
	while(! inf.fail() && cnt < num)
    {
        inf.get(buf[cnt]);
        if(!inf.eof())
        {
            cnt++;
        }
        else
        {
            buf[cnt] = '\0';
		}
    }
    // (1) buf[num - 1] = '\0';
    return cnt;
}


为了验证读取的正确性,我输出读取的字符串。发现读取的和原文件不同。为了查找问题,我输出了读取的个数。

int readFile(ifstream &inf)
{
	char buf[100];
    int readNum ;
    while(0 != (readNum = readFromStream(f_in, buf, 100)))
    {
		cout<<readNum<<endl;
    	// (2) cout<<readNum<<" : "<<strlen(buf)<<endl;
        //f_out<<buf;
    }
}


输出的个数和,与原文见大小相同?我还怀疑是不是编码的问题,不过在查找资料之后排除了。因为在源文件中能显示,复制之后也应该没问题。

后来我又检查了一下buf中字符串的大小,即将 //(2)注释删除。

理论上应该是 100, 100, ..., (file_size % 100),但是发现除了最后一个其余的都大于100。

这下就很明了了。原来是字符串结束符不存在,导致读取的额外的数据造成了。
在readFromStream()中,将 // (1)注释删除,就正确了。所以正确的方法如下:


///从inf 流中,最多读取 (num-1) 个字符,保存在buf中,并返回读取字符数。
int readFromStream(ifstream &inf, char *buf, int num)
{
    //cout<<"her"<<endl;
    int cnt = 0;
    while(! inf.fail() && cnt < num - 1)
    {
        inf.get(buf[cnt]);
        if(!inf.eof())
        {
            cnt++;
        }
        else
        {
            buf[cnt] = '\0';
		}
    }
    buf[num - 1] = '\0';
    return cnt;
}


字符串后面一定要加 '\0'。
即使用数组保存字符串时,有时在输出时并不会判断一读到数组末尾,而是以结束符 '\0' 作为唯一标志。
(分析,猜测)
输出时,虽然传入数组名,可是把它当做指针,所以无法判断数组大小。所以即使读到数组末尾,还会继续输出额外内容。


因为字符串是保存在字符数组中,而且以 '\0'作为结束标志。如果字符数组中字符占满了全部空间,就可能在输出时没有监测到结束符 '\0' 而导致读取额外数据,从而产生不必要的错误。

经验谈:

切记,字符数组保存字符串时,一定要留一个空间保存结束符 '\0'。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值