- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题需要debugging details .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
11 个月前关闭。
Improve this question
我是学习 C 的新手,我需要将一串字符转换为整数、十六进制、八进制。
我知道我可以使用 char *var_name
指向字符串的基数,但我不知道如何将字符串中的每个字符转换为十六进制、八进制或十进制。
例如:
"my name is stackoverflow"
程序应该将字符串的 ASCII 值转换为十六进制、八进制和十进制。
atoi
但我无法让它工作。
sprintf
但不明白如何使用它。
int main(){
char *string;
printf("Enter string: ");
scanf("%s", string);
int d = (int) string;
printf("%d\n",d);
return 0;
}
输入:
stackoverflow
输出:
-535030240
最佳答案
关于转换问题,不需要转换,字符串字符已经定义了其编码,您只需要能够在不同的基数中正确打印它们,为此 printf
已经提供了您需要的说明符:
#include <string.h>
//...
for(size_t i = 0; i < strlen(string); i++){ //printing hex codes
printf("%3x ", string[i]);
}
putchar('\n');
for(size_t i = 0; i < strlen(string); i++){ //printing decimal codes
printf("%3d ", string[i]);
}
putchar('\n');
for(size_t i = 0; i < strlen(string); i++){ //printing octal codes
printf("%3o ", string[i]);
}
scanf("%s", string);
string
是一个未初始化的指针,它没有为它保留任何内存,尝试在其中存储任何内容会导致未定义的行为,您需要为其分配内存或以其他方式使其指向有效的、可写的内存位置。
char *string = calloc(2048, sizeof *string); //space for 2047 characters + null byte
此外,
scanf
使用
%s
说明符在找到空格时将停止读取,因此如果您输入
my name is stackoverflow
, 仅
my
将被解析。它也非常不安全,因为它很容易溢出目标缓冲区,我的建议是让您使用
fgets
(前面提供了一个示例)。
int d = (int) string;
在您的代码中,因为
string
未初始化,行为仍然未定义。
string
指向
int
.
int
通常为 4 个字节,因此您可能会在转换中丢失数据。
string
指向的截断内存地址。指针。
atoi
或类似的东西也不起作用,因为这些函数只转换数字,当它们尝试解析非数字时会失败,但正如我所说,不需要转换。
#include <stdio.h>
#include <stdlib.h>
#define MIN_SIZE 50 //size above 50, memory will be reallocated
int main(){
char *string = calloc(MIN_SIZE, sizeof *string);
if(string == NULL){
return EXIT_FAILURE;
}
int ind = 0; //string index
if(string == NULL){
return EXIT_FAILURE;
}
while((string[ind] = getchar()) != '\n'){ //parse till '\n'
//removing '\n' or EOF
if(string[ind] == EOF || string[ind] == '\n'){
string[ind] = '\0';
break;
}
ind++;
if(ind >= MIN_SIZE){ //if size is more than 50, reallocate
string = realloc(string, ind + 1);
if(string == NULL){
return EXIT_FAILURE;
}
}
}
//...
}
在下面的示例中,我将使用它,我们有一个 2047 个字符的字符串,它非常大,只使用 2Kb 的内存,按照今天的标准,这是非常小的,这是字符串的限制大小,高于字符不会被解析:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 2048
//...
char *string = calloc(SIZE, sizeof *string);
if(string == NULL){
return EXIT_FAILURE;
}
fgets(string, SIZE, stdin); //parse with fgets
string[strcspn(string, "\n")] = '\0'; //removing '\n'
样本输入:
my name is stackoverflow
输出:
6d 79 20 6e 61 6d 65 20 69 73 20 73 74 61 63 6b 6f 76 65
109 121 32 110 97 109 101 32 105 115 32 115 116 97 99 107 111 118 101
155 171 40 156 141 155 145 40 151 163 40 163 164 141 143 153 157 166 145
关于将字符串转换为十六进制、十进制和八进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64115228/
我正在尝试编写一个程序,该程序接受十六进制、八进制和小数的输入,将它们存储在整数变量中,并将它们连同它们转换为十进制形式一起输出。例如: 用户输入:0x43、0123、65 程序输出: 0x43 he
var re = /^([0-9]*)(\.[0-9]{2})$/ re.test(.22) true re.test(.20) false re.test(10.02) true re.test(1
我有一个类型为BigDecimal的属性“initialPrice”的“Trade”类。该属性可以 根据另一个类别“Symbol”中包含的属性“decimals”,小数位数会有所不同,因此需要使用不同
我是这里编码的新手。 我正在尝试使用编码来显示平均值、最大值和最小值的统计信息。 我遇到了错误,他们说我无法将 decimal[] 转换为 int[]。我在我的代码旁边评论了下面的错误。这是最后几行之
在不久的将来,我一直在研究小数类型以获得一些可能的编程乐趣,并希望将它用作比 Int64 更大的整数。一个关键点是我需要找出我可以安全地存储为小数(不丢失精度)的最大整数;我这样说,因为显然它在那里使
所以我这样做了: for(i=1;i0;i--) { if(MASKBINARY[i-1]==1 && MASKBINARY[i]==0) // check if the next eleme
我正在尝试将数字四舍五入到最接近的指定小数。 我希望它四舍五入到小数点 .11、.22、.33、.44、.55、.66、.77、.88 但不是 .99。相反,0.99 应该是 1。 例如: 1.14
获取 python (python 3) Decimal 的整数部分和小数部分的最有效方法是什么? 这是我现在拥有的: from decimal import * >>> divmod(Decimal
我有一个使用十进制列表样式的 ol: ol li { list-style-type: decimal; } First Second 编号工作正常,但如何删除句点?而不是显示: 1.
将字节数组转换为具有所选基数的字符串的最佳方法是什么? S.O. 上有大量示例。和其他地方转换为十六进制字符串。我在这里主要感兴趣的是将十六进制或十进制字符串转换为其他;也是一种更通用的方式。 这是我
不清楚十进制类型的 sizeof。以字节为单位的大小是否像在 sql server 中一样因精度而异? c# 类型的精度变量是“十进制”吗? 我不想打开不安全的代码来只调用小数类型的 sizeof。你
我必须向十进制值添加尾随零。不仅用于显示(因此 Format 不是一个选项),而且用于实际的底层数据,因为小数精度在我们的应用程序中很重要。 我试过: decimal value = 1M decim
我正在使用以下代码行将 decimal 转换为 string: decimal a = 0; a.ToString(); Resharper 给了我以下警告:“明确指定字符串区域性”。我想这是有道理的
我注意到 .NET 在涉及小数和尾随零时有一些古怪/不直观的行为。 0m == 0.000m //true 0.1m == 0.1000m //true 但是 (0m).ToString() == (
最近写单片机 RTC 日期、时间配置,需要实现十进制、BCD码互换,将示例Demo分享给各位朋友: BCD是指用二进制来表示十进制数的编码,即:用4位二进制来表示一位十进制数,因此4位二进制数
这似乎是重复的,但我找不到合适的答案(问题足够接近但是..)我有一个代表十进制数的字符串,它总是有很多小数位,至少 20,有时最多 2000 (代表特定的验证计算,即像'是数字 135 到 147 素
我想知道我是否会收到这样的问题: "Convert a decimal number to two's complement, then give your answer in Hex". 下面是路径
此存储过程不返回十进制格式 00.00 的薪水 ALTER PROCEDURE taxable_varsalary @emp_code bigint, @co_id bigint AS de
使用 leaflet R 包,有没有办法将 zoom 设置为非整数(即十进制)值? 也就是说,介于这两个缩放级别之间: 例子 随着 zoom 从第 3 级移动到第 4 级,它看起来好像正在四舍五入到最
我如何编写一个函数来将十进制数字符串转换为十进制数并将十进制数转换为字符串? 最佳答案 有非常方便的 clojure 函数可以将任何内容转换为字符串以及将类似数字的内容转换为 BigDecimal:
我是一名优秀的程序员,十分优秀!