我正在编写一个程序,将基数为10的数字转换为其他基数的等价物,但是当我尝试运行它时,我一直遇到分段错误。
这是到目前为止的代码:
#include <stdio.h>
int base;
int num;
char* num2[50];
int x =0;
int main(){
printf("Input a number in base 10 and a base (2-16) that you would like to convert to in this format: 100 2\n");
fflush(stdout);
scanf("%d%d",&num, &base);
printf("%d%d", num, base); fflush(stdout);
while ((num % base) > 1){
printf("%d", x); fflush(stdout);
if(num % base == 10)
num2[x] = "A";
else if (num % base == 11)
num2[x] = "B";
else if (num % base == 12)
num2[x] = "C";
else if (num % base == 13)
num2[x] = "D";
else if (num % base == 14)
num2[x] = "E";
else if (num % base == 15)
num2[x] = "F";
else
*num2[x] = num % base;
num = num % base;
x++;
printf("%d, %s", num, num2[x]); fflush(stdout);
}
while (x >= 0){
printf("%s", num2[1]);
fflush(stdout);
x--;
}
printf("\n");
fflush(stdout);
return 0;
}
通过使用gdb和print语句检查错误,我得出的结论是错误源自第14行:
while ((num % base) > 1) {
我对C比较陌生,我所做的大部分工作都是用Java编写的。
答案 0 :(得分:0)
问题,正如我所看到的那样是在else
声明正文中,
else
*num2[x] = num % base;
这里,num[x]
是一个空指针。你无法取消引用。您需要先将内存分配给num[x]
,然后才能使用该位置存储某些值。
答案 1 :(得分:0)
之前的两个答案都是正确的(即@Sourav和@Tony)。 这两个中的确切原因取决于执行实例期间提供的输入。
说,你的输入是num = 3,base = 16
然后,你的程序将在该行崩溃 -
*num2[x] = num % base;
num2 [x]指向NULL,因为&#39; num2&#39;是一个全局数组。
说,你的输入是num = 13,base = 16
然后,你的程序将在该行崩溃 -
num2[x] = "D";
这是因为&#39; num&#39;仍为常数13(num = num % base
),因此&#39; x&#39;最终将超过49并且num2[x]
将访问非法位置。
此外,您的程序在逻辑上存在缺陷;使用当前的方法,您将无法获得所需的输出。您的程序需要稍微调整一下 -
char num2[50]; /* Array of chars, instead of array of pointers to char. */
。 。
/* Add check to verify that base is a value between 2 and 16. */
while ((num % base) > 0){ /* Greater than 0, not 1. */
if(num % base == 10)
num2[x] = 'A'; /* Use a character instead of a string. */
else if (num % base == 11)
num2[x] = 'B';
else if (num % base == 12)
num2[x] = 'C';
else if (num % base == 13)
num2[x] = 'D';
else if (num % base == 14)
num2[x] = 'E';
else if (num % base == 15)
num2[x] = 'F';
else
num2[x] = (num % base) + '0'; /* Convert the number to its character form. */
num /= base; /* Duh! */
printf("%d, %c", num, num2[x]); fflush(stdout); /* %c instead of %s*/
x++;
}
while (x >= 0){
printf("%c", num2[x]); fflush(stdout); /* %c instead of %s*/
x--;
}