我正在编写一个Unix expand实用程序版本,用文件中的空格替换制表符.为此,我正在阅读每个角色并测试它是否是制表符.如果是,它将使用给定的空格量替换选项卡,否则将打印该字符.
我的主要方法是这样的
int main(int argc, char *argv[]){
FILE *fp;
char *help1="-help";
char *help2= "--help";
//int spaces; //number of spaces to replace tabs
fp= fopen(argv[1], "rw");
parse_file(fp, 4);
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
parse_file方法就像
void parse_file(FILE *fp, int spaces)
{
int i; //loop counter
char c; //current character
while (c!= EOF)
{
c= getchar(); //get char from stream
if (c=='\t') //if char is a tab
{
for (i=0; i< spaces; i++)
putchar(" "); //replace with spaces
}
else
putchar(c); //otherwise, print the character
}
Run Code Online (Sandbox Code Playgroud)
}
在编译时,我从指针获得一个没有强制警告的整数,putchar(" ");程序在执行时会遇到段错误.
所以,我的问题:
1-什么是警告"从没有强制转换的指针生成整数"的全部内容?我该怎么做才能解决它?
2-代码在执行时生成段错误,文本文件作为参数传入.这段代码中有什么东西会导致这种情况吗?
你必须使用
putchar(' ')
Run Code Online (Sandbox Code Playgroud)
代替
putchar(" ")
Run Code Online (Sandbox Code Playgroud)
你正在调用putchar一个string(" "),但它需要一个char参数(' ').(实际上是一个int,但只通过一个char是安全的.)
段错可能是因为fcloseon fp,可能是NULL.您应该检查返回值fopen.你之后才注意到的原因parse_file是它根本没有触摸fp(它读取stdin和写入stdout).要使用流fp,您应该使用getc(fp)而putc(fp)不是.(这仍然无效,因为你用比你从中读取数据更多的数据来覆盖流,所以你会得到垃圾.)
实际上,当没有给出命令行参数时,程序肯定会出现段错误.段错误,fopen因为它是空指针argv[1],或者它返回一个空指针本身.
在编写这些类型的程序时,请遵循Unix哲学并将它们写为过滤器:读取stdin,写入stdout.如果不必要,请不要就地修改文件.
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |