- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我从用户输入中得到 long(使用 fgets()
并使用 strtoul()
转换为 long),但是在测试它以转换为整数时给出错误的结果.
声明:
char buf[BUFSIZE];
unsigned char input[80];
int done = 0;
int i, val;
long valPrimary;
char *ptr;
代码:
// gets the max first 79 characters, whichever comes first
if (fgets(input, INPUTSIZE, stdin) != NULL) {
printf("Input ok\n");
} else {
printf("Input not ok\n");
return 0;
}
// get unsigned long from input
valPrimary = strtoul(input, &ptr, 10);
// Check if any character was converted
if (ptr == input) {
fprintf(stderr, "Can't convert string to number\n");
return 0;
}
if ((valPrimary == LONG_MAX || valPrimary == LONG_MIN) && errno== ERANGE) {
fprintf(stderr, "Number out of range for LONG\n");
return 0;
}
printf("valPrimary: %lu\n", valPrimary);
printf("Max Int: %i\n", INT_MAX);
printf("Min Int: %i\n", INT_MIN);
printf("Long size: %lu\n", sizeof(long));
// Check overflows and if long is convertable to int
if ( (valPrimary > INT_MAX) || (valPrimary < INT_MIN) ) {
fprintf(stderr, "Number out of range for INT\n");
return 0;
} else {
val = (int) valPrimary;
}
例如,如果我输入一些非常大的数字,我会得到这种标准输出:
valPrimary: 18446744073709551615
Max Int: 2147483647
但是没有显示错误信息,转换仍然发生。
最佳答案
signed long
和 strtoul()
的不正确混合。使用 strtol()
。 @Quentin strtoul("18446744073709551615",...)
--> ULONG_MAX
转换为 long
可能变成 -1
.
long valPrimary;
...
// valPrimary = strtoul(input, &ptr, 10);
valPrimary = strtol(input, &ptr, 10);
...
if ((valPrimary == LONG_MAX || valPrimary == LONG_MIN) && errno== ERANGE) {
fprintf(stderr, "Number out of range for LONG\n");
关于比较 INT_MAX 和 long 给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593240/
我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 INT_MAX * INT_MAX 溢出,但我不确定为什么这会在 C/C++ 中给出乘积 1。 #include #include int m
我正在学习计算机体系结构,并决定尝试乘法溢出。观察到 INT_MAX * INT_MAX 溢出,但我不确定为什么这会在 C/C++ 中给出乘积 1。 #include #include int m
我的印象是 INT_MAX 将打开 int 的所有 32 位。如果我否定它并与它本身“和”,我应该将全 0 与全 1 进行比较并返回 false。我错过了什么? int x = INT_MAX; x
我想解决一些关于溢出的问题。我有一些数据使用int来存储,数据不会导致溢出但计算中间可能会导致溢出。 比如我需要存储正方形的对角线,边长是50000,所以对角线是70710,边和对角线都远小于INT_
enum Some_Flag { SOME_FLAG_A = 0x00000000u, SOME_FLAG_B = 0x00000001u, SOME_
如何在 C 语言中仅使用按位运算符获取 INT_MAX 的值?我希望 ~0 为 1111111111(1 的补码,所以十进制 -1)和 ~ 0 >> 1 为 0111111111,这将是最大值,但它仍
我在/usr/include/limits.h 中找到了以下定义: #define INT_MIN (-INT_MAX - 1) #define INT_MAX 2147483647 此外,似乎此头文
下面是一段代码,用于检查给定数字是否为 Lychrel 数字。这基本上意味着该程序取一个数及其倒数之和,然后取那个数及其倒数之和,等等,直到找到回文。如果它在一定的迭代次数内没有找到这样的数字(我在这
我在做逆向工程的时候遇到了宏INT_MAX,但是找不到它的值。那么预处理器如何知道它的值呢? 最佳答案 如果你#include (或 C++ 中的 )然后 INT_MAX保证被定义。 它是否真的出现
我的 C 程序执行“Turmrechnung”(预定义的数字(“init_num”乘以预定义的数字范围(init_num*2*3*4*5*6*7*8*9 在我的例子中,由变量“h”定义),然后除以那些
从昨天开始,我一直试图在链表中找到最小的两个数字,但仍然无法做到,所以决定在 stackoverflow 上提问。 我这样做的逻辑是: (1) 首先设置min1->freq和min2->freq为IN
我得到了这段代码: char a[151]; scanf ("%150s", a); 在a可能是一个数字,如果是这样,我需要确定,如果 a INT_MAX) Overflow(); // gr
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
如果我尝试应用:Integer.valueOf(String.valueOf(Integer.MAX_VALUE) + "9"); 我得到一个 NumberFormatException。 但我需要从
在 C++ 中,有符号类型的溢出是未定义的行为。以下示例是否也是未定义的行为? #include int f() { int a = INT_MAX; int b = -1; retur
这个问题已经有答案了: Why is unsigned integer overflow defined behavior but signed integer overflow isn't? (7
嗯,我觉得我的问题比其他问题更复杂一些。我在尝试解决这个问题时意识到了这一点。 我尝试使用 int number = rand() % (INT_MAX - INT_MIN + 1) + INT_MI
为什么这段代码不会产生编译时错误? INT_MAX 是一个宏,它保存可以存储在 int 中的最大值,但是 minVal 没有声明,当我打印它时,它会产生 0 的值。我正在使用 c99 进行编译。 #i
这个问题在这里已经有了答案: for every int x: x+1 > x .... is this always true? (4 个答案) 关闭 9 年前。 for (i = 0; i <=
我从用户输入中得到 long(使用 fgets() 并使用 strtoul() 转换为 long),但是在测试它以转换为整数时给出错误的结果. 声明: char buf[BUFSIZE]; unsig
我是一名优秀的程序员,十分优秀!