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