看似小事,却极易写错

今天写个txt文章转换为html段落的小代码,结果一个地方搞了好一会才发现是哪个地方写错了:

#include <string>
#include <stdio.h>

void main(int argc, char** argv)
{
	if(argc < 2)
	{
		printf("file name failed!!!\n");
		char k;
		scanf("%c", &k);
		return;
	}

	FILE * fp = fopen(argv[1], "r");
	if(fp == NULL)
	{
		printf("file open failed!!!\n");
		char k;
		scanf("%c", &k);
		return;
	}
	fseek(fp, 0, SEEK_END);
	long fszie = ftell(fp);
	fseek(fp, 0, SEEK_SET);
	if(fszie == -1)
	{
		printf("file size failed!!!\n");
		char k;
		scanf("%c", &k);
		return;
	}

	char* sz_str = new char[fszie+1];
	sz_str[fszie] = '\0';
	if(fread(sz_str, 1, fszie, fp) <= 0)
	{
		printf("file size failed!!!\n");
		char k;
		scanf("%c", &k);
		return;
	}

	std::string text = sz_str;
	std::string output_str = "<p>";
	int i = 0;
	while(sz_str[i] != '\0')
	{
		while(sz_str[i] != '\0')//换行符 break
		{
			if(sz_str[i] == '\r')//换行符 break
			{
				if(sz_str[i] != '\n')
				{
					printf("file find \\r but not find \\n failed!!!\n");
					char k;
					scanf("%c", &k);
					return;
				}
				break;
			}else if(sz_str[i] == '\n')//换行符 break
				break;
		
			//处理空格和tab
			if(sz_str[i] == ' ')
				output_str += " ";
			else if(sz_str[i] == '\t')
				output_str += "    ";
			else if(sz_str[i] != 0xcd)
				output_str += sz_str[i];
			
			i++;
		}

		if(sz_str[i] == '\0')
			break;
		else //碰到换行符了
		{
			output_str += "</br>";
			i++;
		}
		
	}
	output_str += "</p>";
	fclose(fp);
	fp = fopen(argv[1], "w");
	if(fp == NULL)
	{
		printf("file open failed!!!\n");
		char k;
		scanf("%c", &k);
		return;
	}
	fwrite(output_str.c_str(), output_str.size(), 1, fp);
	fclose(fp);
}
就错在了 
else if(sz_str[i] != 0xcd)
这一行 我用调试器看了变量值明明就是0xcd啊,那是为何呢?后来理了理头绪,改为 else if(sz_str[i] != (char)0xcd) 就好了

因为之前代码表达式 由char提升为int ,结果sz_str[i]提升为int会变成一个负数, 而0xcd会变成 一个小整数。主要当时把他们看成原始二级制了(无符号)如果改为:

else if((unsigned char)sz_str[i] != (unsigned char)0xcd) 也是可以的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值