相关疑难解决方法(0)

将十六进制字符串(char [])转换为int?

我有一个char []包含一个值,如"0x1800785",但我想要赋值的函数需要一个int,我怎么能把它转换成一个int?我搜索过但找不到答案.谢谢.

c int char

74
推荐指数
6
解决办法
29万
查看次数

std :: stoi实际上是否可以安全使用?

我与某人谈论了垮台事件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)

c++ standards language-lawyer

58
推荐指数
1
解决办法
4万
查看次数

双下划线(__const)在C中意味着什么?

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前面解释双下划线的含义.

c syntax double-underscore

48
推荐指数
2
解决办法
4万
查看次数

atoi vs atol vs strtol vs strtoul vs sscanf

我试图从正在解析的命令行中找出,哪个函数最好将十进制,十六进制或八进制数转换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)

我能看到的唯一问题是解析找到十进制整数和八进制之间的差异.

边题,是否可以将字符串转换为整数使用?

c

16
推荐指数
2
解决办法
2万
查看次数

检测strtol失败

如何检测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

12
推荐指数
1
解决办法
1万
查看次数

在C中从二进制转换为char

我对如何从二进制值转换为c中的char感到困惑.

例如,假设我有01010110,并希望从中打印相应的字母'V'.我该怎么做呢?

谢谢你的帮助!

c binary type-conversion char character-encoding

9
推荐指数
2
解决办法
2万
查看次数

strtol的基础知识?

我真的很困惑.我必须遗漏一些相当简单的东西,但我读到的关于strtol()的任何内容都没有意义.有人能以一种非常基本的方式为我拼出它,并举例说明我可能会得到类似下面的东西吗?

string input = getUserInput;
int numberinput = strtol(input,?,?);
Run Code Online (Sandbox Code Playgroud)

c++ string int strtol

7
推荐指数
1
解决办法
3万
查看次数

为什么你不能检查errno是否等于ERANGE?

我一直在尝试将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)

c errno strtol

7
推荐指数
1
解决办法
967
查看次数

当您向scanf("%d",&argu)输入12ab之类的内容时会发生什么?

当我想检查输入的数字时,我遇到了这个问题.如果我成功输入数字,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不是.所以要小心.

c scanf

5
推荐指数
1
解决办法
2745
查看次数

strtoull 是否总是返回有效数字或设置 errno?

是否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)

正确,还是还需要其他一些检查?

c error-handling language-lawyer strtoull

4
推荐指数
1
解决办法
85
查看次数

我可以将命令行参数读取为二进制吗?

是否可以将命令行参数读取为二进制数?如果是,如何?

例如, ./a -v 10010110

此选项允许用户从 12 个寄存器中选择要使用的寄存器。我希望用户传递一个 16 位二进制数,需要使用 flag 读取寄存器1,否则使用 flat 0

这是我心中的想法。如果这不是一个好主意,我怎样才能在不混淆用户的情况下完成它?

c flags command-line

2
推荐指数
1
解决办法
208
查看次数

如何防止我的代码出现以下转换错误?

这听起来像是一个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,那么这不是正确的选择。我该如何处理这个问题?

c scanf

1
推荐指数
1
解决办法
60
查看次数