gpt4 book ai didi

c - 如何扫描逗号,但逗号未分配给结构? C

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:06 24 4
gpt4 key购买 nike

我想像这样扫描输入:“John, Surname, 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->surname,第二个逗号可能是 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 -- 出了点问题,例如。用户在输入格式时没有使用逗号:'[Name], [Surname], [index]'
2 -- 只有名称正确加载
3 -- 名字和姓氏正确加载(索引出错)

鉴于此,我认为使用 scanf 处理这些错误会很成问题。
在主题中我使用了“how to scanf”,因为我不知道如何正确地表达从用户到结构的扫描数据。
现在,根据 Stephan Lechner 的智慧,我以某种方式参与这种方法:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com