我不喜欢那个问简单问题的人,但我的C有点生疏,有些东西在这里躲过我.我正在尝试使用以下示例文本读取文件:
23# 1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21
Run Code Online (Sandbox Code Playgroud)
我想在几个字符串中分隔由基数和昏迷分隔的元素,但是在我的控制台中根本没有得到任何输出.
#include <stdio.h> /* required for file operations */
#include <conio.h> /* for clrscr */
#include <dos.h> /* for delay */
FILE *fr; /* declare the file pointer */
#include <stdio.h>
int main(void)
{
char output[200];
const char filename[] = "file.txt";
FILE *file = fopen(filename, "r");
if ( file )
{
char line [ BUFSIZ ];
while ( fgets(line, sizeof line, file) )
{ printf(" %s \n", line);
char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
if ( sscanf(line, "%s# %s,%s,%s,%s,%s",
&i, &pt1, &pt2, &pt3, &tp1, &tp2) == 6 )
{
snprintf(output, sizeof output,
"Leitura:=%s,PT1=%s,PT2=%s,PT3=%s,TP1=%s,TP2=%s,",
i, pt1, pt2, pt3, tp1, tp2);
puts(output);
}
}
}
else
{
perror(filename);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是sscanf()不会对待#或,作为分隔符,只有空格.这意味着"%s"将"1110.00:1000.00,120.00:1110.00,1190.00:900.00,-52.98,-53.21"完全读取,导致可能的缓冲区溢出,绝对6不是结果.
解决方案是使用扫描集:
if (sscanf(line,
"%79[^#]# %79[^,],%79[^,],%79[^,],%79[^,],%s",
i,
pt1,
pt2,
pt3,
tp1,
tp2) == 6 )
Run Code Online (Sandbox Code Playgroud)
另外,声明i不正确:
char * i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
Run Code Online (Sandbox Code Playgroud)
因为它是i一个80的数组char*.改成:
char i[80],pt1[80], pt2[80], pt3[80], tp1[80], tp2[80];
Run Code Online (Sandbox Code Playgroud)