我正在尝试在c中实现重复的cat函数。我遇到了分段错误,我无法找到原因。
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
char* s; /* input string */
int c;
if(argc==1){
while (gets(s)){
puts(s);
}
}
else{
FILE *file = fopen( "./argv[1]", "r" );
while((c=fgetc(file))!=EOF){
fputc(c,stdout);
}
fclose(file);
}
return 0;
}
答案 0 :(得分:5)
您正在将字符读入s
而不分配内存:
while (gets(s)){
puts(s);
}
首先使用malloc
分配一些内存(稍后您需要free
):
char *s = malloc(some_buffer_size);
或修复它:
char s[some_buffer_size];
顺便说一下,请注意gets
,因为无法限制输入的字符数,这可能导致缓冲区溢出。请改用fgets(buf, sizeof(buf), stdin)
。
其他人已经指出了第二个错误,你不能这样称呼fopen
,改用它,或者使用H2CO3的解决方案:
FILE *file = fopen( argv[1], "r" );
答案 1 :(得分:1)
gets(s);
- 此处s
未初始化为指向任何内容。
fopen( "./argv[1]", "r" );
- 这是错的。必须是 - fopen(argv[1], "r" );
答案 2 :(得分:0)
fopen( "./argv[1]", "r" );
嗯,什么?假设,对吧?
char buf[0x1000];
snprintf(buf, sizeof(buf), "./%s", argv[1]);
FILE *f = fopen(buf, "r");
此外,您正在使用未初始化的s
指针(您没有为其分配任何内存),因此您的程序也会调用未定义的行为。
答案 3 :(得分:0)
malloc()
基本上分配内存。最后,您还需要free()
您的变量以释放分配的空间。
您应该使用gdb()
来查找错误并调试程序。