gpt4 book ai didi

c - 如何解决电子邮件的 sscanf 问题?

转载 作者:行者123 更新时间:2023-12-01 13:40:43 25 4
gpt4 key购买 nike

这是我的代码:

#include <stdio.h>

int main(int argc, char **argv)
{
const char example[]="13902796D ; Josefa Moral Fidalgo ; someone@server.com ; 01/03/2001 ; 0 ; 1 ;";
char DNI[10];
char name[100];
char email[100];
char date[10];
int gender;
int uni;

sscanf(example, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %d ; %d ; ",
DNI, name, email, date, &gender, &uni);

printf("DNI: %s\n", DNI);
printf("Name: %s\n", name);
printf("Email: %s\n", email);
printf("Date: %s\n", date);
printf("Gender: %d\n", gender);
printf("Uni: %d\n", uni);
return 0;
}

结果如下:

DNI: 13902796D
Name: Josefa Moral Fidalgo
Email:
Date: 01/03/2001
Gender: 0
Uni: 1

但我期待的结果是:

DNI: 13902796D
Name: Josefa Moral Fidalgo
Email: someone@server.com
Date: 01/03/2001
Gender: 0
Uni: 1

我是一个C新手,在网上找不到答案,在Stackoverflow这里也找不到答案,查了一些书也找不到代码的原因

 sscanf(example, "%[^;] ; %[^;] ; %[^;] ; %[^;] ; %d ; %d ; ",
DNI, name, email, date, &gender, &uni);

没用。谁能帮我?除了 sscanf,我不能使用其他函数,这是我的教授想要在代码中使用的。

最佳答案

缓冲区溢出。

代码如何知道不要过度填充 DNI[]?只有 DNI 的地址被传递给 sscanf()。由于 OP 的代码没有为输入提供足够的空间,DNI[] 被覆盖,导致未定义的行为 (UB)。

sscanf(example, "%[^;] ... ", DNI, ....

相反,传递要读取的最大字符数,宽度。 9 将限制最多扫描 9 个字符。由于数组大小为 10,因此将有足够的内存用于 9 个字符和附加的空字符。代码还需要扩大缓冲区以容纳用户输入。

char DNI[10*2];
sscanf(example, "%19[^;] ... ", DNI, ....

但是整个扫描正确吗?
一个简单的方法是用"%n"记录扫描的偏移量。如果扫描到达 "%n"n 将有一个新值。

int n = -1;
sscanf(example, "%9[^;] ;... %n", DNI, ..., &n);

放在一起

int main(int argc, char **argv) {
const char example[]="13902796D ; 1 ;";
char DNI[10*2];
int uni;

int n = -1;
sscanf(example, "%19[^;] ; %d ; %n", DNI, &uni, &n);
if (n < 0) {
puts("Fail");
} else {
printf("DNI: %s\n", DNI);
printf("Uni: %d\n", uni);
}
return 0;
}

代码仍然存在问题,因为 DNI[] 可能是 "13902796D "(注意尾随空格),但这是 OP 需要处理的另一个问题。

关于c - 如何解决电子邮件的 sscanf 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40532389/

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