我有一个char []包含一个值,如"0x1800785",但我想要赋值的函数需要一个int,我怎么能把它转换成一个int?我搜索过但找不到答案.谢谢.
我与某人谈论了垮台事件std::stoi.坦率地说,它在std::strtol内部使用,如果报告错误则抛出.但是,根据他们的说法,std::strtol不应该为输入报告错误"abcxyz",导致stoi不抛出std::invalid_argument.
首先,这里有两个在GCC上测试过的关于这些案例行为的程序:
strtol
stoi
他们都表现出成功"123"和失败"abc".
我查看标准以获取更多信息:
§21.5
Throws: invalid_argument if strtol, strtoul, strtoll, or strtoull reports that
no conversion could be performed. Throws out_of_range if the converted value is
outside the range of representable values for the return type.
Run Code Online (Sandbox Code Playgroud)
总结了依赖的行为strtol.那怎么样strtol?我在C11草案中找到了这个:
§7.22.1.4
If the subject sequence is empty or does not have the expected form, no
conversion is performed; the value …Run Code Online (Sandbox Code Playgroud) extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;
Run Code Online (Sandbox Code Playgroud)
我在Linux机器上的/usr/include/netinet/ether.h中找到了上面的函数定义.
有人可以在const(关键字),addr(标识符)和最后__THROW前面解释双下划线的含义.
我试图从正在解析的命令行中找出,哪个函数最好将十进制,十六进制或八进制数转换int为最佳数 - 不事先知道输入.
然后,目标是使用单个函数来识别不同类型的输入并将其分配给它的integer(int)值,然后可以使用它:
./a.out 23 0xC4 070
Run Code Online (Sandbox Code Playgroud)
可以打印
23
196 /*hexadecimal*/
56 /*octal*/
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一问题是解析找到十进制整数和八进制之间的差异.
边题,是否可以将字符串转换为整数使用?
如何检测strtol()是否未转换数字?我在下面的简单案例中对它进行了测试并输出了0.现在显而易见的问题是如何区分非转换和0的转换?
long int li1;
li1 = strtol("some string with no numbers",NULL,10);
printf("li1: %ld\n",li1);
****
li1: 0
Run Code Online (Sandbox Code Playgroud) 我对如何从二进制值转换为c中的char感到困惑.
例如,假设我有01010110,并希望从中打印相应的字母'V'.我该怎么做呢?
谢谢你的帮助!
我真的很困惑.我必须遗漏一些相当简单的东西,但我读到的关于strtol()的任何内容都没有意义.有人能以一种非常基本的方式为我拼出它,并举例说明我可能会得到类似下面的东西吗?
string input = getUserInput;
int numberinput = strtol(input,?,?);
Run Code Online (Sandbox Code Playgroud) 我一直在尝试将char数组正确转换为long strtol,检查是否存在溢出或下溢,然后对long进行int转换.一路上,我注意到很多代码看起来像这样
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
为什么你不能只说
if(errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果发生下溢或溢出,则在两种情况下都将errno设置为ERANGE.前者真的有必要吗?可以单独检查ERANGE是否有问题?
这就是我的代码现在的样子
char *endPtr;
errno = 0;
long result = strtol(str, &endPtr, 10);
if(errno == ERANGE)
{
// Handle Error
}
else if(result > INT_MAX || result < INT_MIN)
{
// Handle Error
}
else if(endPtr == str || *endPtr != '\0')
{
// Handle Error
}
num = …Run Code Online (Sandbox Code Playgroud) 当我想检查输入的数字时,我遇到了这个问题.如果我成功输入数字,scanf函数将返回1.所以这就是我写的:
int argu;
while(scanf("%d",&argu)!=1){
printf("Please input a number!\n");
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入像abcd这样的东西时,循环将会永远存在而不会停止提示.
我在网上查了一下,发现它与缓存有关,我需要清理它,以便scanf可以获得新数据.所以我尝试了fflush,但它没有用.
然后我看到了这个:
int argu,j;
while(scanf("%d",&argu)!=1){
printf("Please input a number!\n");
while((j=getchar())!='\n' && j != '\n');
}
Run Code Online (Sandbox Code Playgroud)
然后,当我输入像'abcd'这样的东西时,它运作良好,并提示我输入.但是当我输入像"12ab"这样的东西时,它就不会再起作用了.
那么我有没有办法检查scanf的输入("%d",&argu)实际上是一个数字,如果不是,则提示输入另一个输入?
编辑:
我看到了答案并通过使用解决了我的问题scanf.
请注意,该abcd函数实际上是对数组读取'\n'而scanf不是.所以要小心.
是否strtoull保证返回有效数字或设置errno(如果无法解析有效数字)?
换句话说,这是
errno = 0;
n = strtoull(s, 0, 10);
if (errno) {
perror(s);
exit(1);
}
// do something with n
Run Code Online (Sandbox Code Playgroud)
正确,还是还需要其他一些检查?
是否可以将命令行参数读取为二进制数?如果是,如何?
例如,
./a -v 10010110
此选项允许用户从 12 个寄存器中选择要使用的寄存器。我希望用户传递一个 16 位二进制数,需要使用 flag 读取寄存器1,否则使用 flat 0。
这是我心中的想法。如果这不是一个好主意,我怎样才能在不混淆用户的情况下完成它?
这听起来像是一个XY 问题,但我很困惑。
我想在用户输入6时执行一些代码。首先看一下代码:
#include<stdio.h>
int main(void) {
short int x;
printf("Val :");
scanf("%d", &x);
if (x == 6) {
//some code
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
SHRT_MAX在我的系统中是32767,如果用户设法输入65442,这最终将转换为6,并且代码将以此值执行,而它应该在6处执行。嗯,它在6 点执行,但从用户的角度来看,这是缺乏安全性的。是的,我可以使用intor long int,但是如果用户正在破解short int,那么这不是正确的选择。我该如何处理这个问题?