在c中解析char数组

时间:2015-01-18 12:58:16

标签: c

我正在尝试使用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);

1 个答案:

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