现在我正在进行一项任务,但发现用C语言解析用户输入非常困难。这是用户输入的一种输入。
INSERT Alice, 25 Norway Drive, Fitzerald, GA, 40204, 6000.60
这里INSERT是命令(进入链接列表)
爱丽丝是一个名字
25 Norway Drive是一个地址
Fitzerald是一个城市
GA是一个州
40204是邮政编码
6000.60是余额
如何在C中使用scanf或任何其他方法正确地将其作为输入?我面前的最大问题是如何忽略这些“,”并将这些值存储在适当数据类型的单独变量中。
谢谢大家,我已经解决了问题,这是解决方案:
pch = strtok(NULL, ","); pch =
substr(pch, 2, strlen(pch)); //substr is my custom funcition and i believe you can tell by its name what it is doing.
strcpy(customer->streetAddress, pch);
答案 0 :(得分:4)
快速简便的方法:
使用fgets()
从用户处获取字符串;
和strtok()
标记它。
修改
看完你的评论后:
仅使用逗号strtok()
,然后从结果中删除尾随和前导空格。
EDIT2
测试运行后,我注意到你将获得“INSERT Alice”作为第一个令牌。因此,在提取所有令牌之后,再次运行strtok()
,这次使用空格,在提取的第一个令牌上。或者,找到空格,以某种方式从那里识别命令和名称。
答案 1 :(得分:1)
如果你的输入数据格式是固定的,你可以使用[s] scanf()快速而肮脏地使用。
输入:
INSERT Alice, 25 Norway Drive, Fitzerald, GA, 40204, 6000.60
如果从stdin读取,你可以尝试:
char name[80], addr[80], city[80], state[80];
int zip;
double amt;
int res = scanf("INSERT %[^,], %[^,], %[^,], %[^,], %d, %f\n",
&name, &addr, &city, &state, &zip, &amt);
应返回匹配的项目数(即6)。
答案 2 :(得分:0)
scanf()
在这种情况下可能有点棘手。我可能会先使用fgets()
读取字符串,然后使用strtok()
来读取第一个令牌(命令)。此时,您可以继续使用strtok()
和“,”作为分隔符来读取字符串中的其余标记,或者您可以在字符串的其余部分使用sscanf()
(现在你知道其余输入的格式。 sscanf()
仍然会很痛苦,因为在地址和可能的城镇地区中似乎允许有不确定数量的空格。