我想扫描输入,比如:“John,suffname,9999”和逗号不应该分配给扫描变量;删除输入的末尾和开头的空格。。。
现在,要以p->name的形式构造student_t,将用这个逗号指定“John”,而不是“John”如何在输入示例中插入逗号,但未将其分配给p->name?
我甚至不知道如何用语言来表达我的观点。我已经用这个锤头50个小时了。
struct student_t
{
char name[20];
char surname[40];
int index;
};
struct student_t* read(struct student_t* p, int *err_code)
{
*err_code=0;
printf("Please enter data in a format: '[Name], [Surname], [index]':\n");
int c=scanf("%s, %s, %i", &p->name, &p->surname, &p->index);
return p;
}
void show(const struct student_t* p)
{
printf("%s %s, %i\n", p->name, p->surname, p->index);
}
输入示例:
Name, Surname, 9999
输出到此示例:
Name Surname, 9999
相反,我的输出是这样的:
Name, , 0
所以用户输入的第一个“逗号”被赋给p->name,空白是p->姓,第二个逗号可能是p->index,它是'int'类型,这可能就是为什么它是0。
如果我这样做了:
char comma1, comma2, space1, space2;
int c=scanf("%c%s%c%s%c%i%c", &space1, &p->name, &comma1, &p->surname, &comma2, &p->index, &space2);
输出为:
ame, Surname,, 9999
编辑1:
我衷心感谢大家。现在,我并没有提到我也希望处理错误,尽管这可能会让我们更清楚地知道是否应该采取措施来决定。
*错误代码=
0—所有内容都已正确加载到结构中
1—出现问题,例如,用户在键入格式时未使用逗号:“[名称],[姓氏],[索引]”
2—仅正确加载名称
3——名称和姓氏加载正确(索引出错)
鉴于此,我认为使用scanf处理这些错误是相当困难的。
在本主题中,我使用了“如何扫描”,因为我不知道如何正确地表达从用户到结构的扫描数据。
现在,根据斯蒂芬·莱什纳的智慧,我以一种方式参与了这种方法:
char buffer[1024], *pch1, *pch2;
if (fgets(buffer,1024, stdin))
{
pch1=strchr(buffer, ',');
pch2=strrchr(buffer, ',');
if (pch1!=pch2 && pch1!=NULL)
{
char *name = strtok(buffer,","); // returns pointer to the beginning of the token
if (name) { //the place where "," is occured becomes a "NULL" character
sscanf(name," %19s", p->name); // skip leading spaces
char *surname = strtok(NULL,",");
if (surname) {
sscanf(surname," %39s", p->surname); // skip leading spaces
char *index = strtok(NULL,",");
if (index) {
p->index = (int)strtol(index, NULL, 10);
} //else *err_code=3;
} //else *err_code=2;
}
} else *err_code=1;
}
最佳答案
scanf
有几个陷阱,特别是在使用它扫描使用单个语句/格式字符串的多个独立输入字段时例如,新行字符被视为空白,这在多行读取时会产生奇怪的结果此外,您可能希望保护您的代码不被“太长”的用户输入破坏;因此您可以编写"%19s ..."
,但随后输入的其余部分将传递给下一个格式说明符。。。
这些陷阱让人们倾向于说“使用fgets
并自行解析输入,例如使用strtok
代码变得“更长”,但是你可以更好地控制边缘情况。
使用这种方法的代码如下:
int main()
{
struct student_t s;
struct student_t *p = &s;
char buffer[1000];
if (fgets(buffer,1000, stdin)) {
char *name = strtok(buffer,",");
if (name) {
sscanf(name," %19s", p->name); // skip leading spaces
char *surname = strtok(NULL,",");
if (surname) {
sscanf(surname," %39s", p->surname); // skip leading spaces
char *index = strtok(NULL,",");
if (index) {
p->index = (int)strtol(index, NULL, 10);
}
}
}
}
return 0;
}
关于c - 如何扫描逗号,但逗号未分配给结构? C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51343178/