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

C 将字符串转换为十六进制、十进制和八进制,c,character-encoding,type-conversion,C,Character Encoding,Type Conversion,我是学习C的新手,我需要将字符串转换为整数、十六进制和八进制 我知道我可以使用char*var_name指向字符串的底部,但我不知道如何将字符串中的每个字符转换为十六进制、八进制或十进制 例如: "my name is stackoverflow" 程序应将字符串的ASCII值转换为十六进制、八进制和十进制 我试图使用atoi,但我无法让它工作 我也试过打字,但我也没能成功。我考虑过sprintf,但不知道如何使用它 用户应该能够输入任意长度的字符串,它只应该在有换行符时结

我是学习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]);
}
string
是一个未初始化的指针,它没有为它保留的任何内存,尝试在其中存储任何内容会导致未定义的行为,您需要为它分配内存或使它指向有效的、可写的内存位置

e、 g:

此外,使用
%s
说明符的
scanf
在找到空格时将停止读取,因此如果您输入
我的名字是stackoverflow
,则只会解析
我的
。它也非常不安全,因为它很容易使目标缓冲区溢出,我的建议是供您使用(前面提供了一个示例)

之后,当您使用:

 int d = (int) string;
在代码中,由于
string
未初始化,因此行为仍然未定义

如果像上面的例子那样初始化它,则会发生的情况是将
string
指向的内存地址转换为
int

这仍然是一个问题,因为在今天的64位机器中,地址的大小通常为8字节,而
int
通常为4字节,因此在转换过程中可能会丢失数据

打印时,打印的是
字符串所指向的截断内存地址

不用说,代码并没有实现您希望它实现的功能,使用
atoi
或类似的功能也不会起作用,因为这些函数只转换数字,当它们试图解析非数字时,它们会失败,但正如我所说的,不需要转换


至于解析数量不确定的字符,我认为这是不必要的,而且开销太大,因为随着字符串的增长,需要重新分配内存。给它一个大尺寸应该可以做到这一点

但是,如果您真的想这样做,您可以使用以下策略:

输出:

-535030240
6D79206E616D6520697320737461636B6F7665
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

指针字符串的值不确定。因此,下面的scanf没有意义。字符*字符串;printf(“输入字符串:”);scanf(“%s”,字符串);为什么atoi不工作?发布不起作用的代码。铸造是胡说八道,那没有任何意义。您应该为此使用函数族,而不是atoi。atoi没有错误处理功能,不支持其他基数和十进制数,因此不应在任何C程序中使用,它是一个过时的函数。@Lundin,操作的目的是将字符串中的字符转换为整数、八进制和十六进制,格式很差,可能很难理解,把像
atoi
sprintf
这样的东西扔进去也没用,但我认为不需要更多的细节,投票决定重新打开。@anastaciu这不是一个“给我代码”的网站。抛开一些代码,只是随机猜测字符串处理在C中的工作方式,这并不重要,因为这些代码与所描述的问题没有丝毫关系。OP需要发布实际有问题的代码。不,在OP改进之前,不应回答或重新打开。尤其是如果答案需要涵盖初级C级书籍的3章。@Lundin,我明白你的意思,我认为你是对的,只要再努力一点,OP本可以做得更好。在这种情况下,至少,我们可以看到,在提问之前尝试过的一些事情,尽管有点笨拙,但在很多情况下,这是我们看不到的。
 int d = (int) string;
#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;
           }
        }
    }
    //...
}
#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