- 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/
需要帮助将这些给定的数字打印成星号,但我是编程新手;我该怎么做? #include int main(void) { int a[5]={20,1,5,15,12}; int i=0
使用 Delphi XE 2 我试图确定缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且图像的 OnGesture 事件中的 EventInfo 属性没有此信息. 我见
我不知道制服在内存中是如何表示的。 制服似乎会占用宝贵的寄存器空间,但它们最终会传入/通过/传出到全局内存中,对吗? 制服不用时情况会发生变化吗?编译器可以将它们优化掉吗?--在这种情况下,我已经将无
我正在尝试在名为“timeclock”的模型上记录“time_in”和“time_out”记录。这是我想做但无法开始工作的事情! 检查最后一个时钟条目,看看它是否同时填充了“time_in”和“tim
我想听听您如何解决这种编程任务!?每种类型(OPER = 1 类型)对应一种特定的信息。 这只是大约 10 个具有相同结构的规范之一。首选创建这些“转换器”(协议(protocol))的通用方法。 最
我正在使用 Rest API(NodeJS、Express)和 PostgreSQL 制作 React-Native 应用。 在我的本地机器上托管时一切正常。当 API 托管在我的机器上并且 Post
我是一名优秀的程序员,十分优秀!