我正在尝试读取配置文件中给出的接口列表。
char readList[3];
memset(readList,'\0',sizeof(readList));
fgets(linebuf, sizeof(linebuf),fp); //I get the file pointer(fp) without any error
sscanf(linebuf, "List %s, %s, %s \n",
&readList[0],
&readList[1],
&readList[2]);
假设配置文件的行是这样的 list value1 value2 value3
我无法阅读此内容。有人可以告诉我这样做的正确语法。我在这里做错了什么。
答案 0 :(得分:1)
你的char readlist[3]
是一个包含三个字符的数组。但是你需要的是一个包含三个字符串的数组,比如char readlist[3][MUCH]
。然后,像
sscanf(linebuf, "list %s %s %s",
readList[0],
readList[1],
readList[2]);
也许会成功。请注意,scanf中的字母字符串需要逐个字符匹配(因此list
,而不是List
),格式字符串中的任何空格都是跳过字符串中所有空格的信号。下一个非空白字符。另请注意&
参数中缺少readList
,因为它们已经是指针。
答案 1 :(得分:1)
格式字符串中的%s
转换说明符读取一系列非空白字符,并存储在传递给sscanf
的相应参数指向的缓冲区中。缓冲区必须足够大,以存储输入字符串加上由sscanf
自动添加的终止空字节,否则它是未定义的行为。
char readList[3];
上述语句将readList
定义为3
个字符的数组。你需要的是一个大小足以存储由sscanf
写的字符串的字符数组。您的"List %s, %s, %s \n"
调用中的格式字符串sscanf
也意味着它必须与字符串"List"
中的'
和两个逗号linebuf
完全匹配sscanf
其他{{} 1}}将因匹配失败而失败。确保字符串linebuf
的格式相应,否则这是我的建议。此外,您必须通过指定最大字段宽度来防止sscanf
超出其写入的缓冲区,否则将导致未定义的行为。最大字段宽度应小于缓冲区大小,以容纳终止空字节。
// assuming the max length of a string in linebuf is 40
// +1 for the terminating null byte which is added by sscanf
char readList[3][40+1];
fgets(linebuf, sizeof linebuf, fp);
// "%40s" means that sscanf will write at most 40 chars
// in the buffer and then append the null byte at the end.
sscanf(linebuf,
"%40s%40s%40s",
readList[0],
readList[1],
readList[2]);