【发布时间】:2017-11-18 01:25:30
【问题描述】:
有没有办法让这种错误检查变得更好?还是我忘记了什么?我期待一个整数然后是字符串。我将建议添加到代码中。
#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>
【问题讨论】:
-
为了获得更好的反馈,请发布所使用的真实输入、看到的输出和预期的输出。
-
@chux 我更新了我的代码。我在我的代码中添加了
isalpha()check 的小调整。 -
noobprogrammer1987
isalpha(string[0])没有为string[0]的大多数负值定义。高度可移植的代码使用isalpha((unsigned char) string[0]) -
@chux 它甚至不是“高度可移植的”,许多在最常用的签名字符平台上调试 CRT ;) 将直接 assert 用于负值。
-
@AnttiHaapala 你能详细说明你在说什么吗?
标签: c error-handling