使用sscanf从字符串获取输入
我从用户那里得到以下字符串作为输入:使用sscanf从字符串获取输入,c,C,我从用户那里得到以下字符串作为输入:“id、姓名、年龄、年级、国家、城市” -id仅由数字0-9组成 -名称由a-zA-z字母组成 -等级仅由数字0-9组成 -国家/地区由a-zA-z字母、空格和“-”破折号组成。 -城市由a-zA-z字母、空格和“-”破折号组成 我试着把每个字段分成它自己的字符串 我的代码是: char id[MAX_STRING_SIZE], name[MAX_STRING_SIZE], grade[MAX_STRING_SIZE], age[MAX_STRING_SIZE
“id、姓名、年龄、年级、国家、城市”
-id仅由数字0-9组成
-名称由a-zA-z字母组成
-等级仅由数字0-9组成
-国家/地区由a-zA-z字母、空格和“-”破折号组成。
-城市由a-zA-z字母、空格和“-”破折号组成
我试着把每个字段分成它自己的字符串
我的代码是:
char id[MAX_STRING_SIZE], name[MAX_STRING_SIZE], grade[MAX_STRING_SIZE], age[MAX_STRING_SIZE],
country[MAX_STRING_SIZE],city[MAX_STRING_SIZE];
sscanf(userInput,SEPARATOR,id,name,grade,age,country,city);
其中,userInput
是一个字符串,格式为“id、name、age、grade、country、city”
和const char SEPARATOR[]=“%[^,],%[^,],%[^,],%[^,],%[^,\n],%s”代码>
但是,此代码会因某些输入而中断,例如“id、年龄、年级、国家、城市”
以下是您可以执行的操作,而不是@williampersell建议的sscanf
char* field[6];
field[0] = userInput;
for (int n=0, i=1; userInput[n] && (i < sizeof(field)/sizeof(field[0])); ++n)
{
if (userInput[n] == ',')
{
userInput[n] = '\0';
field[i] = &userInput[n+1];
++i;
}
}
char*字段[6];
字段[0]=用户输入;
对于(int n=0,i=1;userInput[n]&&(i
可能需要先制作一份userInput的副本,为什么会出现问题?这是一个无效的输入。只需检查sscanf
返回值,如果输入为invlay,则发出错误消息。为什么要这样做?如果您已经拥有该字符串,则(可能)不需要为所有数据制作额外的副本。只需解析字符串!迭代字符串并查找逗号(或使用strchr
),将其替换为“\0”,然后设置指针。甚至可以使用strtok
。使用strtok
通常是错误的,但这比使用sscanf要好。@Eraklon,因为我需要知道我在哪个领域有问题。。你的解决方案不会成功work@WilliamPursell逐字符扫描?那该死的代码太多了@willhunting1337那么,明智的做法是用某种方式表达这个问题,这样就可以清楚地知道你到底想要什么。无效输入的预期输出/行为是什么。