3 回答
TA贡献1818条经验 获得超8个赞
num
将始终包含一个整数,因为它是一个整数int
。您的代码的真正问题是您不检查scanf
返回值。scanf
返回成功读取的项目数,因此在这种情况下,它必须返回1表示有效值。如果没有,则输入无效的整数值,并且num
变量可能没有被更改(即仍然具有任意值,因为您没有初始化它)。
在评论中,您只想允许用户输入一个整数,然后输入回车键。不幸的是,这不能简单地实现scanf("%d\n")
,但这是一个诀窍:
int num;char term;if(scanf("%d%c", &num, &term) != 2 || term != '\n') printf("failure\n");else printf("valid integer followed by enter key\n");
TA贡献1831条经验 获得超10个赞
您需要先将输入作为字符串读取,然后解析字符串以查看它是否包含有效的数字字符。如果是,那么您可以将其转换为整数。
char s[MAX_LINE];valid = FALSE;fgets(s, sizeof(s), stdin);len = strlen(s);while (len > 0 && isspace(s[len - 1])) len--; // strip trailing newline or other white space if (len > 0){ valid = TRUE; for (i = 0; i < len; ++i) { if (!isdigit(s[i])) { valid = FALSE; break; } }}
TA贡献1865条经验 获得超7个赞
有几个问题与使用scanf
与%d
转换说明这样做:
如果输入字符串以有效整数(例如“12abc”)开头,则“12”将从输入流中读取并转换并分配给
num
,并scanf
返回1,因此您将指示成功(可能) )不应该;如果输入字符串不以数字开头,则
scanf
不会读取输入流中的任何字符,num
也不会更改,返回值将为0;您没有指定是否需要处理非十进制格式,但如果必须处理八进制或十六进制格式(0x1a)的整数值,则不起作用。该
%i
转换说明处理十进制,八和十六进制格式,但你仍然有前两个问题。
首先,您需要将输入读取为字符串(最好使用fgets
)。如果您不被允许使用atoi
,您可能不允许使用它们strtol
。所以你需要检查字符串中的每个字符。检查数字值的安全方法是使用isdigit
库函数(还有用于分别检查八进制和十六进制数字的函数isodigit
和isxdigit
函数),例如
while (*input && isdigit(*input)) input++;
(如果你甚至不被允许使用isdigit
,isodigit
或者isxdigit
,那么请你的老师/教授打电话让他们的任务比实际需要的更难)。
如果您需要能够处理八进制或十六进制格式,那么它会变得更复杂一些。C约定是八进制格式具有前导0
数字,十六进制格式具有前导0x
。因此,如果第一个非空白字符为0,则必须先检查下一个字符,然后才能知道要使用哪种非十进制格式。
基本概要是
如果第一个非空白字符不是' - ','+','0'或非零十进制数字,那么这不是一个有效的整数字符串;
如果第一个非空白字符是' - ',那么这是一个负值,否则我们假设一个正值;
如果第一个字符是'+',那么这是一个正值;
如果第一个非空白字符和非符号字符是非零十进制数字,则输入为十进制格式,您将用于
isdigit
检查剩余字符;如果第一个非空白字符和非符号字符为'0',则输入为八进制或十六进制格式;
如果第一个非空白字符和非符号字符是'0'而下一个字符是从'0'到'7'的数字,那么输入是八进制格式,你将
isodigit
用来检查剩余的字符;如果第一个非空格和非符号字符为0且第二个字符为
x
或X
,则输入为十六进制格式,您将用于isxdigit
检查剩余字符;如果任何剩余字符不满足上面指定的检查功能,则这不是有效的整数字符串。
- 3 回答
- 0 关注
- 693 浏览
添加回答
举报