任务是
制作一个从文本文件中读取并写入其他文本文件的程序
仅在命令行参数中给出的符号
例如:
程序a-z in.txt out.txt
将文件out.txt只写入a-z范围内的字母
程序a-9 in.txt out.txt
将文件out.txt只写入a-z0-9范围内的字母
可以假设所有输入的数据都是正确的。
所以这是我的尝试:
int main(int argc, char** argv)
{
FILE *fileIn, *fileOut;
fileIn = fopen(argv[2] , "rb");
fileOut = fopen(argv[3] , "wb");
char *arguments = argv[1];
printf("%d - %d\n", arguments[0], arguments[2]);
char a;
do
{
a = fgetc(fileIn);
if( a > arguments[0] && a < arguments[2])
fputc(a, fileOut);
} while (a != EOF);
fclose(fileIn);
fclose(fileOut);
return 0;
}
我的第一个想法是采取args并将它们用作ascii限制器
它在某种程度上适用于a-z,但与其他它不相干
问题是:
我怎么能改善这个?
我应该改变这样做的方式吗?
答案 0 :(得分:0)
如果您将a-9
作为参数,则程序无法正常工作,因为数字字母('0'
到'9'
)的ascii代码值都小于那些对于小写罗马字母('a'
到'z'
)。
例如,'0'
的值为0x30(&#39; 1&#39;为0x31,依此类推),&#39; a&#39;是0x61(&#39; b&#39;是0x62,依此类推),因此根本不会执行条件为(a >= 'a' && a <= '9')
的if语句。
当被测试的字符等于if
或0
时,argument[0]
语句的条件表达式将评估为argument[2]
。你可能想改变它。
答案 1 :(得分:0)
我会将您的if
语句修改为以下内容:
if(arguments[2] >= '0' && arguments[2] <= '9') {
if((a >= arguments[0] && a <= arguments[0]) || (a >= '0' && a <= arguments[2]))
{
fputc(a, fileout);
}
}
else if(arguments[2] >= 'a' && arguments[2] <= 'z' && arguments[0] >= 'a' && arguments[0] <= 'z') {
if(a >= arguments[0] && a <= arguments[2]) {
fputc(a, fileout);
}
}