我正在尝试使用fgets和sscanf从文件中读取。在我的文件中,我在while的每一行都有字符,我希望将其放入向量中。到目前为止,我有以下内容:
FILE *fp;
fp = fopen(filename, "r");
if(!fp)
{
fprintf(stderr, "Unable to open file %s\n", filename);
return 0;
}
// Read file
int line_count = 0;
char buffer[1024];
while(fgets(buffer, 1023, fp))
{
// Increment line counter
line_count++;
char *bufferp = buffer;
...
while(*bufferp != '\n')
{
char *tmp;
if(sscanf(bufferp, "%c", tmp) != 1)
{
fprintf(stderr, "Syntax error reading axiom on "
"line %d in file %s\n", line_count, filename);
return 0;
}
axiom.push_back(tmp);
printf("put %s in axiom vector\n", axiom[axiom.size()-1]);
// increment buffer pointer
bufferp++;
}
}
我的公理向量定义为vector<char *> axiom;
。当我运行程序时,我遇到了一个seg错误。当我执行sscanf
时会发生这种情况。关于我做错了什么的建议?
答案 0 :(得分:2)
tmp
是一个指针,而不是一个数组,因此读入它会导致缓冲区溢出。
首先,您应该将tmp
的声明更改为:
char *tmp = malloc(SOME_MAXIMUM_SIZE * sizeof(char));
然后你应该记得在完成后释放axioms
中的所有指针。
答案 1 :(得分:2)
更安全的方法是使用std::string
和std::vector<std::string>
。
string
类型处理文本的内存分配。另请参阅getline
和std::string::c_str()
。