我正在尝试使用C来解析这个字符数组:" Smith C. John,103,10,10,10和#34; (没有引号)。
我已经尝试过了:
int group = 0, mark1 = 0, mark2 = 0, mark3 = 0;
char input[100];
char lastName[100];
char firstName[100];
char initial[100];
int n;
fgets(input, 1000, sourceFile);
n = sscanf(input,"%s %s. %s, %d, %d, %d, %d\n", lastName, initial, firstName, group, mark1, mark2, mark3);
此代码仅正确读取姓氏和首字母(不幸地带点)。 值应该是这样的:
lastName = Smith
initial = C
firstName = John
group = 103
mark1 = 10
mark2 = 10
mark3 = 10
请帮帮我! 谢谢!
更改为此工作:
int i = 1, group = 0;
float mark1 = 0, mark2 = 0, mark3 = 0;
char input[100];
char lastName[100];
char firstName[100];
char initial[100];
int n;
fgets(input, sizeof(input), sursa);
n = sscanf(input,"%99s %99[^'.']. %99[^','], %d, %f, %f, %f\n", lastName, initial, firstName, &group, &mark1, &mark2, &mark3);
答案 0 :(得分:1)
你应该为"%d"
说明符传递一个整数指针,在这种情况下你应该只取你传递的int
个变量的地址
n = sscanf(input,
"%s %s. %s, %d, %d, %d, %d\n",
lastName,
initial,
firstName,
&group,
/* ^ pass the address of group */
&mark1,
&mark2,
&mark3
);
如果您启用了编译器警告,它会警告您。
另外,您声明输入
char input[100];
然后像这样调用fgets()
fgets(input, 1000, sourceFile);
可能会溢出输入,以防止您可以使用sizeof
运算符
fgets(input, sizeof(input), sourceFile);
请注意,sizeof
运算符不计算input
数组中字符串的长度,而是计算字节数(以字节为单位)。
要查找字符串的长度,您需要strlen()
函数。
您还应该将格式字符串更改为
"%99s%99[^'.'].%99[^','],%d,%d,%d,%d\n"
此处%99
可以防止缓冲区溢出,并且它应该比缓冲区" 1小1,用于终止'\0'
" ,"%99[^'.']"
表示使用除'.'
之外的所有字符,以便在找到'.'
时停止,然后明确使用与'.'
,"%99[^',']"
相同的解释'.'
,但适用于','
。
因此生成的代码将是
n = sscanf(input,
"%99s%99[^'.'].%99[^','],%d,%d,%d,%d\n",
lastName,
initial,
firstName,
&group,
/* ^ pass the address of group */
&mark1,
&mark2,
&mark3
);