#include<stdio.h>
int main()
{
char *arg[10],*c;
int count=0;
FILE *fp,*fq;
printf("Name of the file:");
scanf("%s",arg[1]);
fp=fopen(arg[1],"w");
printf("\t\t%s",arg[1]);
printf("Input the text into the file\n");
printf("Press Ctrl+d to the stop\n");
while((*c=getchar())!=EOF)
{
fwrite(c,sizeof(char),1,fp);
count++;
}
return 0;
}
答案 0 :(得分:3)
更改此行
char *arg[10],*c;
到
char arg[1000],c;
这一行
scanf("%s",arg[1]);
到
scanf("%s",arg);
这一行
while((*c=getchar())!=EOF)
到
while((c=getchar())!=EOF)
说明:
char *c;
不是角色。它是角色的指针。它开始只是指向一个随机的内存位,通常会填充随机数据 - 无论最近写的是什么。
char c;
是一个角色。
同样的事情适用于char *arg[10]
。这是十个指针的数组。它们指向随机存储器,充满了随机数据。
注意:我的更改是不是最佳做法。如果有人要输入长度为1000个字符或更长的文件名,则需要在arg
缓冲区的末尾写入。根据您正在做的事情,这可能是一个安全漏洞。
答案 1 :(得分:1)
char *arg[10] ;
arg
是一个char指针数组。在进行输入之前,您需要使用malloc
为它们分配内存位置 -
scanf("%s",arg[1]); // arg[1] is not assigned to point to any memory location
// and is what causing the segmentation fault.
所以 -
arg[1] = malloc( stringLengthExpectedToEnter + 1 ) ; // +1 for termination character
对于其他数组元素也应如此(或)只需将char*arg[10]
更改为char arg[10]
,并确保只输入9个字符。
我认为您在指针和正常变量之间感到困惑。
int *ptr;
ptr
是可以保存整数变量地址的变量。内存分配给ptr
变量以保存整数地址。而已。 ptr
处于未初始化状态,并且不指向(或)可能指向垃圾的位置。取消引用未初始化指针的行为是未定义的,如果它提供分段错误,您很幸运。
现在,您需要使用malloc
为其分配有效的内存位置。
ptr = malloc( sizeof(int) ) ; // Allocates number of bytes required to hold an
// integer and returns it's address.
因此,ptr
现在指向从可以容纳整数的免费商店获取的内存位置。必须使用free
释放从免费存储中获取的此类位置,否则您会遇到内存泄漏的经典问题。最好在声明时初始化指向 NULL 的指针。
int *ptr = NULL ;
希望它有所帮助!
scanf("%d", ptr) ; // Notice that & is not required before ptr. Because ptr
// content is address itself.
正常变量故事完全不同。声明时 -
int var ;
将内存分配给var
以保存整数。因此,您可以直接为其分配一个整数。
答案 2 :(得分:1)
在
char *arg[10];
你定义了一个包含10个指向char 的指针的数组,但你没有初始化它的元素。 arg [0],arg [1],...,arg [9]都会有未定义的值。
然后,您尝试将字符串输入其中一个未定义的值。幸运的是,你有一个分段错误。如果你运气不好,你的计划could format your hard disk会改为。
答案 3 :(得分:0)
#include<stdio.h>
int main()
{
char arg[10],c;
int count=0;
FILE *fp;
printf("Name of the file:");
scanf("%s",arg);
fp=fopen(arg,"w");
printf("\t\t%s",arg);
printf("Input the text into the file\n");
printf("Press Ctrl+d to the stop\n");
while((c=getchar())!=EOF)
{
fwrite(&c,sizeof(char),1,fp);
count++;
}
if(fp != NULL){
fclose(fp);
fp = NULL;
}
return 0;
}