使用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那么,明智的做法是用某种方式表达这个问题,这样就可以清楚地知道你到底想要什么。无效输入的预期输出/行为是什么。