[英]atoi() accepting strings mixed with number
对于我需要使用if atoi(INPUT) == 0
来检查用户输入是否有效的 integer 而不是 0 的任务。问题是当我输入任何以 integer 开头的字符串时,它会自动被接受,即使有是 integer 之后的非整数字符,例如接受“1aaaabcc”。
我知道 atoi() 在我刚才说的例子中,会取 1 并忽略它,但理论上这应该是用户输入的错误,因为它不是有效的 integer。我的代码中是否可以添加一些东西(不添加任何库)或用 atoi 改变一些东西来解决这个问题?
如果您需要示例代码以防不清楚,请告诉我。
function atoi
是此 function 调用的“别名”
atoi: (int)strtol(nptr, (char **)NULL, 10)
因此,在您的情况下,您应该使用 function strtol
并传递不等于指向指针的NULL
的第二个参数。 在这种情况下,您可以检查指针是否指向相应字符串的末尾。
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char *endptr;
int n = ( int )strtol( "A", &endptr, 10 );
printf( "n = %d, *endptr = %d\n", n, *endptr );
n = ( int )strtol( "10A", &endptr, 10 );
printf( "n = %d, *endptr = %d\n", n, *endptr );
n = ( int )strtol( "10", &endptr, 10 );
printf( "n = %d, *endptr = %d\n", n, *endptr );
}
它的 output 是
n = 0, *endptr = 65
n = 10, *endptr = 65
n = 10, *endptr = 0
正如您只能在 function strtol
的第三次调用中看到的那样,指针endptr
指向终止零字符'\0'
。 在所有前面的调用中,它指向具有 ASCII 代码65
的字母'A'
。
您还可以接受或拒绝字符串,例如"10 "
。 如果要接受这样的字符串,那么在这种情况下,您需要检查字符串的尾部是否只包含空白字符。
您应该仔细阅读 function strtol
的描述。
aoti()
对于快速和肮脏的代码很有用,但不能胜任强大的错误处理任务。
integer 之后的非整数字符,如"1aaaabcc"
中的字符,最好使用strtol()
检测。
使用strtol()
,我们可以检测到更多。
超出了像"12345678901234567890"
这样的int
的范围,但不是相同长度的"00000000000000000001"
。
当文本全部为空白时,允许在 integer 之后使用非整数字符。 这是合理的,因为strtol()/atoi()
接受可选的前导空白。 它还允许传递整行输入,例如"1234\n"
。
没有像"asd"
、 " "
、 ""
那样的转换。
我推荐一个帮手 function
// Return true on success
bool convert_string_to_int(int *dest, const char *s) {
errno = 0;
char *endptr; // Gets updated to point to the end of the conversion.
long lvlaue = strtol(s, &endptr, 0);
if (s == endptr) {
*dest = 0;
return false; // No conversion
}
if (errno == ERANGE || lvalue < INT_MIN || lvalue > INT_MAX) {
errno = ERANGE;
*dest = lvalue < 0 ? INT_MIN : INT_MAX;
return false; // Out of range.
}
*dest = (int) lvalue;
if (errno) {
return false; // Implementation specific errors like s == NULL
}
while (isspace(*((unsigned char *)endptr))) {
endptr++;
}
if (*endptr) {
return false; // Junk at the end.
}
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.