我正在编写Unix expand实用程序的一个版本,它将文件中的制表符替换为空格。为此,我读取每个字符,并测试它是否是制表符。如果是,则用给定的空格量替换制表符,否则将打印字符。
我的main方法是这样的
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;
}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
}}
编译时,我从指针得到一个整数,没有putchar(" ");的强制转换警告,程序在执行时遇到了段错误。
所以,我的问题是:
1-警告"makes from pointer without cast“是关于什么的?我能做些什么来解决这个问题?
2-代码在执行时生成一个段错误,并将一个文本文件作为参数传入。这段代码中有没有什么东西会导致这种情况呢?
发布于 2011-02-10 23:14:25
putchar (" "),但它需要一个char参数(' ')。(实际上是一个int,但只传递一个char是安全的。)fp上的fclose造成的,它可能是NULL。您应该检查fopen的返回值。您只注意到parse_file之后的原因是它根本不接触fp (它从stdin读取并写入stdout)。要使用流fp,您应该使用getc(fp)和putc(fp)。(这仍然是行不通的,因为您将用比从中读取的数据更多的数据覆盖流,因此您将得到垃圾。)事实上,当没有给出命令行参数时,程序肯定会出现segfault。要么是因为接收到空指针argv[1]而导致fopen分段错误,要么是因为它本身返回了一个空指针。
在编写这类程序时,请遵循Unix的理念,将它们写成filters:从stdin读取,写入stdout。如果没有必要,不要就地修改文件。
发布于 2011-02-10 23:12:55
您必须使用
putchar(' ')相反,
putchar(" ")发布于 2011-02-10 23:15:23
在C语言中,字符串文字的类型是char *,即指向包含字符串字符的某个区域的指针。" "是字符串文字,而不是字符。如果需要单个字符,请使用' '
https://stackoverflow.com/questions/4958793
复制相似问题