我已经有了代码但由于我怀疑我搞砸了我的指针而无法正常工作。
该问题应该将给定的十进制转换为十六进制。我们应该手动完成它,这就是为什么我不能使用printf打印它或使用strtol或其他什么。
这是我的代码:
答案 0 :(得分:1)
while (&ptr != '\0')
应为while (*ptr != '\0')
。
此外,
while (*ptr != '\0') {
ptr++;
base++;
}
// ptr points to the end of the string now. The condition in the next line can't be true.
while (*ptr != '\0') {
switch (*ptr) {
case '0':
replaceInt = 0;
...
第一个循环将使ptr前进,以便永远不会输入它之后的循环。
答案 1 :(得分:1)
添加到nmicheals所说的内容。 你函数的最后3行似乎属于最后一个while循环。否则,您只需为最后一位数更改一次值。
答案 2 :(得分:0)
这个循环保证你的解析循环永远不会运行。
while (&ptr != '\0') { // As noted by the other poster you want *ptr instead of &ptr
ptr++;
base++;
}
您需要在此循环后重置指针,以便下一个循环运行。
ptr=string;
答案 3 :(得分:0)
您的代码运行方向错误。字符串“2ef”从右到左解析。但是当对字符串进行罚款并且从不运行while循环时,ptr的值位于'\ 0'值。 ptr也需要递减和基数增加。我在处理1位数时将base设置为0。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int convertHexToDec(char *string);
/* Runs the main program and asks for user input */
int main(int argc, char* argv[]) {
char* programName;
programName = argv[0];
/* Prints an error if user's input is less than 1 argument. */
if(argc <= 1) {
printf("Error: Not enough arguments.\n");
}
if (argc >= 2) {
int i;
for (i = 1; i <= argc - 1; ++i) {
printf("%s = %d\n", argv[i], convertHexToDec(argv[i]));
}
}
return 0;
}
int convertHexToDec(char* string) {
char *ptr;
ptr = string;
int decimalNum = 0, base = 0, replaceInt = 0;
while (*ptr != '\0') {
ptr++;
}
ptr--;
while (*ptr != '\0') {
switch (*ptr) {
case '0':
replaceInt = 0;
break;
case '1':
replaceInt = 1;
break;
case '2':
replaceInt = 2;
break;
case '3':
replaceInt = 3;
break;
case '4':
replaceInt = 4;
break;
case '5':
replaceInt = 5;
break;
case '6':
replaceInt = 6;
break;
case '7':
replaceInt = 7;
break;
case '8':
replaceInt = 8;
break;
case '9':
replaceInt = 9;
break;
case 'a':
replaceInt = 10;
break;
case 'b':
replaceInt = 11;
break;
case 'c':
replaceInt = 12;
break;
case 'd':
replaceInt = 13;
break;
case 'e':
replaceInt = 14;
break;
case 'f':
replaceInt = 15;
break;
default:
printf("Wrong input");
exit(0);
}
decimalNum += pow(16, base) * replaceInt;
ptr--;
base++;
}
return decimalNum;
}