gpt4 book ai didi

c - 是否有像 sscanf 这样的不同函数来查找特定格式的输入字段并保存它们?

转载 作者:行者123 更新时间:2023-11-30 16:10:43 26 4
gpt4 key购买 nike

我使用 sscanf 方法来查找标准输入的特定格式,例如此类输入:

我的问题是我用 sscanf 指定了正确的正则表达式,并将它们保存到变量中,但每次我尝试调试它时,它们都没有按照我想要的方式保存,尽管我检查了很多 sscanf 用法的示例以及什么我觉得我的做法是正确的,因此我来这里寻求建议,以使其正确。这是我的代码中的问题行,我需要获得建议

 if (strcmp(gets(currentLine),"q")){
numOfFields = sscanf(currentLine,
"%d%*[\t]%[a-zA-Z -]%*[\t]%f%*[\t]%f%*[\t]%[a-zA-Z -]%*[\t]%[a-zA-Z -]",
&studentID, &studentName, &studentAge, &studentGrade, &studentCountry,
&studentCity);

我尝试使用 sscanf 方法,但它没有返回我通过检查正则表达式所期望的正确字段,示例如下:

3888914775 Itzel Gardner 21 26 伊朗德黑兰

它不会将 id 和名称等保存在我添加的正确变量中。

在下面您可以看到我的代码和预期结果。

int getAllStudents(){

int numOfFields=0;
char currentLine[150]="null";
int studentCounter=0;
int studentID;
float studentAge,studentGrade;
char studentName[MAX_STRING_FIELD],studentCountry[MAX_STRING_FIELD],
studentCity[MAX_STRING_FIELD];

while (1){
printf("Enter student info. To exit press q, then enter");
if (strcmp(gets(currentLine),"q")){
numOfFields = sscanf(currentLine,
"%d%*[\t]%[a-zA-Z -]%*[\t]%f%*[\t]%f%*[\t]%[a-zA-Z -]%*[\t]%[a-zA-Z -]",
&studentID, &studentName, &studentAge, &studentGrade, &studentCountry,
&studentCity);

if (numOfFields != 6 ) {
printf("ERROR!");
break;
}

allStudents[studentCounter].studentID=studentID;
allStudents[studentCounter].studentAge=studentAge;
allStudents[studentCounter].studentGrade=studentGrade;
strcpy(allStudents[studentCounter].studentName,studentName);
strcpy(allStudents[studentCounter].studentCountry,studentCountry);
strcpy(allStudents[studentCounter].studentCity,studentCity);
allStudents[studentCounter].average=(studentGrade/studentAge);
studentCounter++;
}else if(studentCounter>0){

struct student bestStud=allStudents[0];
int i=1;
while(i < studentCounter){

if(allStudents[i].average > bestStud.average){
bestStud = allStudents[i];
}
i++;
}
printf("%s", "best student info is: ");
printf("%d %s %f %f %s %s",
bestStud.studentID, bestStud.studentName, bestStud.studentAge,
bestStud.studentGrade, bestStud.studentCity, bestStud.studentCountry);
break;
}

}

}

程序运行应该是这样的:

Enter student info. To exit press q, then enter
3888914775 Itzel Gardner 21 26 Iran Tehran
Enter student info. To exit press q, then enter
5496060426 Korbin Murillo 4 30 Pakistan Islamabad
Enter student info. To exit press q, then enter
3845354610 Rhett Vargas 98 29 United-Kingdom London
Enter student info. To exit press q, then enter
q
best student info is: 3845354610 Rhett Vargas 98 29 United-Kingdom
London

我期望我的输出到任何这些输入都能工作,但它总是给出错误。

编辑:

我现在要问的简单问题将回答我的问题:

让我们看一下这段代码:

  char test[40];
char current[100]="a oday adsa 4";
int a;
sscanf(current,"%[a-zA-Z -]*%d*",&test,&a);
printf(test);
printf(a);

这不会打印任何内容,但如果我删除 a 让我们这样说:

  char test[40];
char current[100]="a oday adsa 4";
int a;
sscanf(current,"%[a-zA-Z -]*",&test);
printf(test);

它将根据需要工作并打印,因此输出预计为

 a    oday    adsa
4

但它并没有像这样打印,实际上当我调试它时,a被保存为0,我缺少什么?

最佳答案

Is there a different function like sscanf to find specific format input fields and save them?

有很多扫描/解析功能,是的。 C++ 中的标准库比 C 中的标准库多,但您始终可以使用外部库。

My problem is i specified the right regex with sscanf

但正如我已经说过的, sscanf 不使用正则表达式

我知道 [character class]语法看起来类似于正则表达式语法。然而,它不是正则表达式。我鼓励您阅读我链接的文档,其中描述了 scanf 的语法家庭实际上使用。

If it doesn't use regular expressions it would've not worked on what I want to do by parts

你没有检查你的假设。您的假设错误,并且您没有仔细检查实际发生的情况。这是完全正常的,完全可以理解,并且可能是一个很难学习的教训。

但你确实需要学习它,而不是告诉那些为你提供免费帮助的人你比他们更了解,尤其是当你的代码无法运行时。

... you can test doing %[0-9]* or %[a-zA-Z]* and you'll see

这是一个实验。亲自尝试一下,然后引用该文档。

  • 第 1 步:可能可行的最简单的方法。

    我们首先只转换第一个字段。剩下的事情我们稍后会考虑,只需根据链接的文档编写即可。

    char tmp[100] = {};
    int rv = sscanf("a oday adsa 4", "%[a-zA-Z -]", tmp);
    printf("sscanf returned %d, tmp is '%s'\n", rv, tmp);

    告诉我sscanf returned 1 ,因为一个字段已成功扫描。该字段是 %[a-zA-Z -] ,在文档中定义并在下面进一步讨论。确认一下,tmp的值确实显示为"a oday adsa " .

    [set] matches a non-empty sequence of character from set of characters

    注意没有尾随 * 。文档表明不需要这样做,我们已经证实了这一点。我们接下来会将其添加回来,看看会发生什么。

  • 第 2 步:* 是什么?确实

    char tmp[100] = {};
    int rv = sscanf("a oday adsa 4", "%[a-zA-Z -]*", tmp);
    printf("sscanf returned %d, tmp is '%s'\n", rv, tmp);

    告诉我sscanf returned 1 ,因为一个字段已成功扫描。该字段是 %[a-zA-Z -] , 像之前一样。正在追加*我们的格式字符串并没有改变 tmp 的内容完全没有。

    这次我们重新添加了 *在格式字符串的末尾。阅读链接的文档,您会发现它不是 % 的一部分。格式说明符,是一个

    non-whitespace multibyte characters except %: each such character in the format string consumes exactly one identical character from the input stream, or causes the function to fail if the next character on the stream does not compare equal.

    但到目前为止,这没有明显的效果,因为它已经匹配了唯一的输入字段。失败只会影响下一个转换,目前还没有任何转换。那么,让我们在下一个测试中添加一个。

  • 第 3 步:失败的影响

    int val = 0;
    rv = sscanf("a oday adsa 4", "%[a-zA-Z -]*%d", tmp, &val);
    printf("scanf returned %d, tmp is '%s', val=%d\n", rv, tmp, val);

    告诉我sscanf returned 1因为它成功地转换了一个字段。字符串输出值正确。它从未转换整数值,因为在到达 %d 之前出现错误,因为*格式字符串中的任何文字 * 都不匹配在输入中。

  • 第 4 步:实际可行的方法

    int val = 0;
    rv = sscanf("a oday adsa 4", "%[a-zA-Z -]%d", tmp, &val);
    printf("scanf returned %d, tmp is '%s', val=%d\n", rv, tmp, val);

    告诉我sscanf returned 2因为它转换了两个字段。字符串和整数输出值是正确的。

  • 第 5 步:确认

    int val = 0;
    rv = sscanf("a oday adsa *4", "%[a-zA-Z -]*%d", tmp, &val);
    printf("scanf returned %d, tmp is '%s', val=%d\n", rv, tmp, val);

    告诉我sscanf returned 2因为它转换了两个字段。字符串和整数输出值是正确的。现在,文字 *格式字符串中的字符与文字 * 匹配我添加到输入中。这只是确认行为与文档相符。

关于c - 是否有像 sscanf 这样的不同函数来查找特定格式的输入字段并保存它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58811751/

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