gpt4 book ai didi

将字符串转换为十六进制、十进制和八进制

转载 作者:行者123 更新时间:2023-12-04 08:50:40 24 4
gpt4 key购买 nike

关闭。这个问题需要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 .
这仍然是有问题的,因为在今天的 64 位机器中,地址通常是 8 字节,而 int通常为 4 个字节,因此您可能会在转换中丢失数据。
当您打印它时,您正在打印的是 string 指向的截断内存地址。指针。
不用说,代码没有做你想要它做的事情,使用 atoi或类似的东西也不起作用,因为这些函数只转换数字,当它们尝试解析非数字时会失败,但正如我所说,不需要转换。

至于不确定字符数的解析,我认为这是不必要的,而且开销太大,因为随着字符串的增长,您需要重新分配内存。给它一个大尺寸应该可以解决问题。
但是,如果您真的想这样做,则可以使用以下策略:
Online demo
#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 的内存,按照今天的标准,这是非常小的,这是字符串的限制大小,高于字符不会被解析:
Online demo
#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com