Ошибка в моей передаче строки в функцию, которая является указателем в C? - PullRequest
0 голосов
/ 31 октября 2019

Инструкция: Хорошо, я работаю над кодом, в котором я делаю преобразования чисел. Я предлагаю пользователю дать мне базу и ввод битов с математическим символом, таким как «+», «-», «*» и т. Д., И я делаю расчет, если у вас есть стратегия для этого, тогда чувствуюсвободно дать мне идею.

Проблема: Несмотря на это, я работаю над некоторой стратегией, как это сделать, но у меня проблемы с моим персонажем, строками, указателями на символы. Я не знаю, как решить это. Я не понимаю, что такое указатели, кроме места в памяти. Мне нужна помощь в решении этой проблемы.

baseToDec Функция: В любом случае, у меня есть метод / функция с именем baseToDec, где я выполняю преобразование битов в десятичную и возвращаю int. Внутри этих параметров у меня есть char *, который принимает значение. например, «1001», что является значением 9.

Способы: Однако, когда я помещаю строку «first» внутри этого параметра внизу в моем main, я получаю сегментацию ошибок. Я не знаю, как объявить это строковое значение, когда я не получу предупреждения или ошибку сегментации. Я попытался сначала изменить переменную на char *, я попытался сделать адрес. Я не понимаю этоЯ хотел бы знать, как я могу сделать это, чтобы я не получил предупреждение, и оно возвращает целое число плавно.

int baseToDec(int base, char* value)
{
    int len = strlen(value);
    int power = 1, result = 0,i, j, num;

    if(base > 2) //not binary
    {
    for (i = len - 1; i >= 0; i--)
    {
            result += number(value[i]) * power;
            power = power * base;
    }
    }
    else if(base = 2)
    {
    while(value[i] == '0' || value[i] == '1' )// (2) remove the most significant binary digit(leftmost) and add it to the result.
    {
            if(value[i] == '1')
            {
                    result = result * 2 + 1;
            }
    else if(value[i] == '0')
    {
            result *= 2;
    }
    i++;
    }       // (3) If all binary digits have been removed, you're done. Stop.
    }
    return result;
}
int main()
{       
    int base, i = 0, j =0, dec; // dec is declared here. 
    char input[100], first[100], second[100];
    char option;
    instructions(); 
    scanf("%s", &option);
    while(option != 'q')
    { 
    i = 0;
    printf("Base: ");
    scanf("%d", &base);
    printf("Input: ");
    scanf("%s", input);      
    while(input[i] != '+' && input[i] != '-' && input[i] != '*' && input[i] != '/')
    {       
            i++;
    }
    printf("%d", i);
    if(input[i] == '+')
    {       
            for(j = 0; j < i; j++)
            {       
                    first[j] = input[j];
            }
            first[i] = 0;              
            dec = baseToDec(base, first); // Error takes place here. 
    }
}

Я знаю, что это много написано, но я перечислил, где происходят ошибки и метод, который я передаю.

1 Ответ

0 голосов
/ 31 октября 2019

Это неправильно:

scanf("%s", &option);

Когда вы используете %s, вы должны предоставить указатель на строку, которая может содержать весь ввод. option - это char, а не строка. В нем есть место только для одного символа, но %s записывает входное слово, за которым следует нулевой терминатор.

Используйте формат %c для чтения одного символа.

scanf(" %c", &option);

Также,

if (base = 2)

должно быть

if (base == 2)

Но нет необходимости рассматривать двоичный файл иначе, чем любую другую базу, процесс преобразования такой же.

...