- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个小程序来检查页面对齐。当我在程序本身中对地址变量的值进行硬编码时,该程序工作正常,但是当我尝试使用 argc 和 argv 值从命令行获取它们时,输出变得随意,是否无法使用 atoi 函数从命令行恢复 uint64_t 的值。 .?
普通代码,可以看到地址的值被硬编码到程序本身。
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int aligned(uint64_t addr, uint64_t pgsize){
5 return ((uint64_t)addr % pgsize == 0);
6 }
7
8 int main(int argc, char*argv[]){
9 uint32_t i;
10 uint64_t addr, size;
11 addr=0x1900000000;
12 size=0x100000000 ;
13
14 for(i=0;i<7;i++)
15 if(aligned(addr,size>>i)){
16 printf("Aligned to %#lx\n",size>>i);
17 }
18 else
19 printf("Not Aligned to %#lx\n",size>>i);
20 return 0;
21 }
输出
[souravhimanshu] ./aligned
Aligned to 0
Aligned to 0x80000000
Aligned to 0x40000000
Aligned to 0x20000000
Aligned to 0x10000000
Aligned to 0x8000000
Aligned to 0x4000000
带命令行输入的代码
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int aligned(uint64_t addr, uint64_t pgsize){
5 return ((uint64_t)addr % pgsize == 0);
6 }
7
8 int main(int argc, char*argv[]){
9 uint32_t i;
10 uint64_t addr, size;
11 if(argc<2){
12 printf("usage ./chkalign <address>\n");
13 exit(-1);
14 }
15 addr=atoi(argv[1]);
16 printf("%#lx",addr);
17 //addr=0x1900000000;
18 size=0x100000000 ;
19
20 for(i=0;i<7;i++)
21 if(aligned(addr,size>>i)){
22 printf("Aligned to %#lx\n",size>>i);
23 }
24 else
25 printf("Not Aligned to %#lx\n",size>>i);
26 return 0;
27 }
输出(不正确)
[sourav@himanshu] ./chkalign 0x924000000
0Aligned to 0
Aligned to 0x80000000
Aligned to 0x40000000
Aligned to 0x20000000
Aligned to 0x10000000
Aligned to 0x8000000
Aligned to 0x4000000
因为我们可以看到在 atoi 函数显示 0 之后打印时 addr 的值。
请指教...
最佳答案
您没有指定平台,请注意内存地址不一定与 int
大小相同。 atoi
返回一个 int
,因此出现问题。
即使 long
也可能不够大以容纳内存地址(如在 Windows IIRC 中)。因此,您应该使用 strtoull
返回保证至少为 64 位的 unsigned long long
。还使用 0
作为转换的基础,允许在命令行上将地址输入为 0x80000000
。还与您的类型更加一致和可移植:long
不一定是 64 位,因此它不应在 printf
中打印为 "%lx"
>.
还要研究您的风格。一致性有助于避免错误。
这是更正后的版本:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int aligned(uint64_t addr, uint64_t pgsize) {
return (addr % pgsize) == 0;
}
int main(int argc, char *argv[]) {
int i;
uint64_t addr, size;
if (argc < 2) {
printf("usage: ./chkalign <address>\n");
exit(-1);
}
addr = strtoull(argv[1], NULL, 0);
printf("Address %#llx:\n", (unsigned long long)addr);
//addr = 0x1900000000;
size = 0x100000000;
for (i = 0; i < 7; i++) {
if (aligned(addr, size >> i)) {
printf("Aligned to %#llx\n", (unsigned long long)size >> i);
} else {
printf("Not Aligned to %#llx\n", (unsigned long long)size >> i);
break;
}
}
return 0;
}
关于c - 使用 atoi 函数从命令行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384390/
本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,Python, C++, Java 题目地址:https://leetcode-cn.com/problems/string-to
我正在读取通过 RS485 发送的值,这是编码器的值我首先检查它是否已返回 E 字符(编码器报告错误),如果没有则执行以下操作 *position = atoi( buffer );
我有一个问题,我的 C 程序只为小于 5 的值正确分配了输入数据。我发现在创建保存值的 int 数组时出错:我使用了 atoi(var-1) 而不是 atoi(变种)-1。 当var='5'时,打印出
我试图在字符串 509951644 和 4099516441 上调用 atoi。第一个毫无问题地转换了。第二个是给我十进制值 2,147,483,647 (0x7FFFFFFF)。为什么会这样? 最佳
我编写了一个程序,它从用户那里获取 2 个参数并将它们加在一起,例如,如果用户输入 ./test 12 4,它将打印出总和:16。 令我困惑的是为什么我必须使用 atoi我不能只使用 argv[1]
你好,我有一个函数叫 int SearchKey(char key[]). 我给出的关键是这样的字符串 2014-02-13T23:50:00 在函数中我只保留数字,这意味着我的字符串变成这样:201
我正在制作用于组装的 atoi 函数。 无论我尝试什么都行不通,我也不知道为什么。 有谁知道是什么问题? org 100h mov si, stri ;parameter call atoi
我正在尝试解决家庭作业问题。说明是用 C 语言编写 Vigenere 密码。 C 不喜欢下面的代码: rot = atoi(argv[1][index]) - 'A'; rot 已声明为整数; ind
我试图编写自己的 atoi() 函数实现,并尝试了两种不同的代码: #include #include int myatoi(const char *string); int main(int a
我希望在不使用任何其他函数(如 strtonum())的情况下重现 atoi() 函数的行为。我真的不明白如何将 char 或 char * 转换为 int 而不是将其转换为 ASCII 值。我在 C
我有以下代码: char* input = (char*)malloc(sizeof(char) * BUFFER) // buffer is defined to 100 int digit = a
我想在编译时实现atoi()函数(在C++语言中,使用C++11或C++14标准)。因此它应该能够将双引号中的文本解析为数字,或者报告错误。更具体地说,它是更大系统的一部分,能够在编译时解析类似 pr
以下代码显示了奇怪的行为: int main() { char numArr[] = {'9','8','5'}; int num; printf("%d\n",num);
这是代码: #include /* atoi: convert s to integer; version 2 */ int atoi(char s[]) { int i, n, sign; fo
我在这个简单的循环练习中遇到问题。我认为代码是正确的,并且没有收到任何错误,但是当我运行程序时,我只是一遍又一遍地收到“^C”。请帮忙。 #import #import #include int
我对 atoi() 有一个奇怪的问题:我有一个字符串(比如说 str),类似于“aaaa 1111\0”(我打印并检查过 - 确实是这样)。我尝试在 str+5 上执行 atoi,但程序崩溃了。我在前
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
如何在不使用给定参数中的 atoi 的情况下将字符串转换为整数?这是我尝试过的: int main(int argc, char *argv[]){ for(int i = 1; i < ar
我使用 atoi() 从 header 获取状态代码,但它不适用于以下输入: "404 Not Found\r\n内容类型: text/html\r\n日期: 2013 年 12 月 12 日星期四
printf("Enter a number or type 'Exit' to exit\n"); long val = 0; int y = 3; scanf("%s",
我是一名优秀的程序员,十分优秀!