我在读取字符串时遇到问题sscanf
。我简化了代码以专注于问题。下面是整个代码中的一个函数,它应该打开一个文件并读取一些内容。但sscanf
表现得很奇怪。例如我声明一个名为atm
与内容'ATOM'
。之前sscanf
它将这个字符串打印为ATOM
而之后它为空。可能是什么问题呢?我认为这一定是一个分配问题,但我找不到它。我尝试了一些关于其他主题的建议,例如替换%s
与其他事情,但它没有帮助。
void Get (struct protein p, int mode, int type)
{
FILE *fd; //input file
char name[100]="1CMA"; //array for input file name
char string[600]; //the array where each line of the data file is stored when reading
char atm[100]="ATOM";
char begin[4];
int index1 =0;
fd = fopen(name, "r"); // open the input file
if(fd==NULL) {
printf("Error: can't open file.\n");
return 1;
}
if( type==0 ) { //pdb file type
if( mode==0 ) {
while( fgets(string, 600, fd)!=NULL ) {
printf("1 %s\n",atm);
sscanf (string, "%4s", begin );
printf("2 %s \n",atm);
}
}
}
fclose(fd);
free(fd);
free(name);
}
字符串begin
不够大,无法容纳四个字符sscanf
会读and its \0
终结者。如果\0
被写入atm
(取决于字符串在内存中的位置),atm
将被修改。来自sscanf 联机帮助页, 有关s
指示:
s 匹配一系列非空白字符; next 指针必须是指向字符数组的指针,该数组的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。
我能够在我的机器上重现这种行为,尽管字符串在内存中的确切位置有点不同。不过,通过打印字符串的地址,很容易准确地弄清楚发生了什么。这是一个最小的例子:
#include<stdio.h>
int main() {
char begin[2];
char atm[100]="ATOM";
printf("begin: %p\n", begin);
printf("begin+16: %p\n", begin+16);
printf("atom: %p\n", atm);
printf("1 %s\n",atm);
sscanf("AAAABBBBCCCCDDDD", "%16s", begin);
printf("2 %s \n",atm);
return 0;
}
这会产生输出:
$ ./a.out
begin: 0x7fffffffe120
begin+16: 0x7fffffffe130
atom: 0x7fffffffe130
1 ATOM
2
我打印了指针的值来计算出需要多大的字符串才能溢出atm
。因为(在我的机器上)atom
开始于begin+16
,读入十六个字符begin
将空终止符放在begin+16
,这是第一个字符atm
,所以现在atm
长度为 0。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)