什么';strcpy()有什么问题吗?(分段故障)
此代码中的strcpy()有什么问题什么';strcpy()有什么问题吗?(分段故障),c,string,C,String,此代码中的strcpy()有什么问题 void process_filedata(char *filename) { void* content; const char * buffer; char * temp; char * row; char * col; int lsize,buflen,tmp,num_scan; //num_scan - number of characters scanned int m=0,p=0,d=0,j=0; //m - mach
void process_filedata(char *filename)
{
void* content;
const char * buffer;
char * temp;
char * row;
char * col;
int lsize,buflen,tmp,num_scan; //num_scan - number of characters scanned
int m=0,p=0,d=0,j=0; //m - machine, p - phase, d- delimiter, j - job
FILE *file_pointer = fopen("machinetimesnew.csv","r");
if(file_pointer == NULL)
{
error_flag = print_error("Error opening file");
if(error_flag) exit(1);
}
fseek(file_pointer, 0 ,SEEK_END);
lsize = ftell(file_pointer);
buflen = lsize;
rewind(file_pointer);
// content = (char*) malloc(sizeof(char)*lsize);
fread(content,1,lsize,file_pointer);
buffer = (const char*) content;
strcpy(temp,buffer);
row = strtok(temp,"\n");
...............
...............
我遇到分段错误。您没有为临时文件分配任何空间。这是一个。strcpy没有问题。您没有初始化
temp
您没有为temp分配内存char*temp
没有初始化,因此您没有为其分配任何内存
尝试:
temp=(字符*)malloc(大小)代码>
其中,SIZE
是要为temp
分配多少内存,实际上这里有三个分段错误:
fread(content,1,lsize,file_pointer);
strcpy(temp,buffer);
row = strtok(temp,"\n");
第一个是fread()
第二个是strcpy()
,您试图复制到一个不指向任何内容的指针。没有为temp
静态或动态分配内存(指针引用本身除外)
通过将temp
更改为这样(静态分配)来解决此问题:
或者使用malloc()
为它动态分配内存(以及您的其他指针,因此它们实际上指向某个对象),同样也为内容分配内存。如果您知道编译时需要的缓冲区大小,请使用静态分配。如果没有,请使用malloc()“知道”是另一个问题的主题
第三个是strtok()
,它将就地修改temp
,这显然是无法做到的,因为从未分配过temp
。在任何情况下,不要期望temp
在strtok()
完成后保持相同。根据变量的名称,我假设您知道
此外,初始化指针与为其分配内存不是一回事:
char *temp = NULL; // temp is initialized
char *temp = (char *) malloc(size); // temp is allocated if malloc returns agreeably, cast return to not break c++
最后,请养成使用strncpy()而不是strcpy()的习惯,它更安全 这段代码让我很感兴趣:
if(file_pointer == NULL)
{
error_flag = print_error("Error opening file");
if(error_flag) exit(1);
}
如果文件指针为空,是否应该无条件退出?还有一个错误fread
不会将nul字符添加到缓冲区的末尾。这是因为它只处理字节数组,而不处理以nul结尾的字符串。所以你需要这样做:
content = malloc(lsize + 1);
fread(content,1,lsize,file_pointer);
content[lsize] = 0;
temp = malloc(lsize + 1);
strcpy(temp, content);
或者这个:
content = malloc(lsize);
fread(content,1,lsize,file_pointer);
temp = malloc(lsize + 1);
memcpy(temp, content, lsize);
temp[lsize] = 0;
(另外,在真实代码中,您应该检查fread
和malloc
的结果)为什么要对malloc进行注释?还要意识到缓冲区
是不必要的。只需将content
achar*
。为什么使用一个字母的变量名?如果你花时间来评论他们的名字,为什么不花额外的2秒钟来拯救你自己和其他人未来的不幸并正确地说出他们的名字呢?谢谢大家。当然,但即使是“安全”版本也要求输入参数应该是实际值,而不是未初始化的垃圾。如果这里的strcpy有什么问题,那么整个C语言也有同样的问题。一旦第一个bug被修复,我们就可以担心buffer
指向的数据是否实际包含NUL分隔符:-)是的。。那篇文章不完整。是这样的。错误标志=打印错误(100)//错误100:打开文件时出错!如果(错误标志)退出(1),则返回1@blacktooth,在打印好的错误并退出之前修改(可能)非原子错误标志有什么用?此外,仅当标志为高时,使exit()
到达有什么用?如果fopen()
返回空指针,为什么不退出呢?我想过用这种方式编写print\u error函数。int print_error(int error_type){switch(error_type){case 100:printf(“错误打开文件”);返回1;中断;case 101:printf(“无效输入!使用默认值零”);//某物返回0;break;………..这是个坏主意吗?fread()
行也不正确,因为内容也未初始化。@caf,我说的是指针s
:)更新。
content = malloc(lsize);
fread(content,1,lsize,file_pointer);
temp = malloc(lsize + 1);
memcpy(temp, content, lsize);
temp[lsize] = 0;