gpt4 book ai didi

C编程读取输入错误检查

转载 作者:行者123 更新时间:2023-11-30 14:53:10 25 4
gpt4 key购买 nike

有没有办法让这个错误检查更好一些?或者我忘记了什么?我期待一个整数然后是字符串。我将建议添加到代码中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

int main(void) {
// your code goes here
char line[150] = {0};
int sscanf_counter = 0;
int num = 0;
char string[150] = {0};
char dummy;

while(fgets(line, sizeof line, stdin))
{
printf("line is %s\n", line);
sscanf_counter = sscanf(line, "%d %s %c", &num, string, &dummy);
printf ("sscanf_counter: %d\n", sscanf_counter);
if (sscanf_counter == 2 && isalpha(string[0]))
{
printf ("Good value: %d\n", num);
printf ("string: <%s>\n", string);
}
else
{
printf ("BAD VALUE: %d \n", num);
printf ("string: <%s>\n", string);
}
memset(line, 0, sizeof line);
}

printf("Does this print? \n");

return 0;
}

我不想将 222 转换为字符串,因此我在代码中添加了一个简单的 isalpha() 检查。我想要第一个值的实际数字和第二个值的实际字母字符而不是转换为字符串的数字。

稍作调整后的输出:

aaa aaa
line is aaa aaa

sscanf_counter: 0
BAD VALUE: 0
string: <>
111 222
line is 111 222

sscanf_counter: 2
BAD VALUE: 111
string: <222>
111 aaa
line is 111 aaa

sscanf_counter: 2
Good value: 111
string: <aaa>

最佳答案

有没有办法让这个错误检查更好?

"%d" 未在溢出时指定。 strtol() 可以提供更强大的错误检查。

“%d %s” 未检测到无关的额外输入。

要处理额外的输入并仍然使用 sscanf(),请参见下文。如果sscanf_counter == 3,则检测到额外的非空白输入。

char dummy;
sscanf_counter = sscanf(line, "%d %s %c", &num, string, &dummy);
<小时/>

测试 if (sscanf_counter == ...) 应该在使用变量之前进行。

  printf ("sscanf_counter: %d\n", sscanf_counter);
if (sscanf_counter >= 1) printf ("num: %d\n", num);
if (sscanf_counter >= 2) printf ("string: %s\n", string);

提示:打印字符串时,请考虑可打印句子以帮助检测前导/尾随空白问题。 (尽管这些不是 "%s" 所期望的。)

// printf ("string: %s\n", string);
printf ("string: <%s>\n", string);
<小时/>

OT:不要编写魔数(Magic Number),而是使用适应的代码

// memset(line, 0, 150);
memset(line, 0, sizeof line);

// while(fgets(line, 150, stdin) != NULL)
while (fgets(line, sizeof line, stdin))

关于C编程读取输入错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361539/

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