代码编译正常。当我执行时,我只收到消息(Segmentation fault(core dumped))。任何帮助将不胜感激!
该程序应该改变输入参数的基础。例如./convert 10 2 5 6 7 输入基数:10 产出基数:2 输入基数中的参数:5 6 7
我刚开始学习c ...你能提供的任何帮助都会很棒! 谢谢!
编辑:不再遇到分段错误问题。谢谢。
#include <stdio.h>
#include <string.h>
int makeInt(char digits[]) {
int num = 0;
int i = 0;
while (digits[i] != '\0') {
num = num * 10 + (digits[i] - '0');
i++;
}
return num;
}
//converts from original base to base 10
int makeBase10(char digits[],int a) {
int num = 0;
int pow = 1;
int i = 0;
int x = 0;
int length = strlen(digits);
char k;
for (i = length -1; i > -1; i--){
k = digits[i];
if(k <= '9' && k >= '0'){
x = (int)k - '0';
}
else{
x = (int)k - 'a' + 10;
}
num = num + (x*pow);
pow = pow * a;
}
return num;
}
//changes number from base 10 to knew base
// and returns as string
char * toString(char str[], int num, int b) {
int i = 0;
char x;
int mod = 0;
while(0 < num){
mod = num % b;
if(mod < 10 && mod > -1){
x = (char)(num + '0');
}
else{
x = (char)(num - 10 + 'a');
}
str[i] =(int) x;
num = num/b;
}
str[i] = '\0';
int length = i + 1;
int j = 0;
char *reverse;
for(i = length -2; i >= 0; i--){
reverse[i] = str[j];
j++;
}
reverse[length-1] = '\0';
return reverse;
}
int main(int argc, char *argv[]) {
int i;
int num;
int a;
int b;
char str[33]; //binary could be up to 32 + '\0'
a = makeInt(argv[0]); //input base
b = makeInt(argv[1]);; //output base
printf("make int worked and input works");
num = 0;
i = 2;
while (i < argc) {
num = makeBase10(argv[i], a);
printf("%s\n", toString(str, num, b));
i++;
}
}
答案 0 :(得分:1)
您正在使用未初始化的指针。
int length = i + 1;
int j = 0;
char *reverse; // here is the problem
for(i = length -2; i >= 0; i--){
reverse[i] = str[j];
j++;
}
reverse[length-1] = '\0';
当使用未初始化的指针时,您正在写入恰好存储在该变量中的任何内存地址。没有给出合理的价值。因此,您正在写入一些不适合写入应用程序的内存位置。计算机内存是分段的。每个记忆区域都有一个所有者,可以在那里写。这是一个安全预防措施,它可以防止错误导致系统混乱。
您必须先使用malloc
char *reverse = malloc(length);
或者如果你在编译时知道你可以做的最大尺寸:
char reverse[MAX_SIZE];
P.S。为了反转你不要遍历整个字符串直到开始只有一半。而不是for(i = length -2; i >= 0; i--)
写:for(i = length -2; i >= length / 2; i--)
答案 1 :(得分:0)
char * reverse in toStrong没有分配任何内存,可能导致段错误,部分来自argv [0]总是你运行的程序的名称,你需要使用argv [1]以后的输入