sscanf读取多个字符

时间:2014-03-20 07:15:36

标签: c parsing scanf

我正在尝试读取配置文件中给出的接口列表。

 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

我无法阅读此内容。有人可以告诉我这样做的正确语法。我在这里做错了什么。

2 个答案:

答案 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]);