Несовместимые типы указателей, передающие «строку» (также известную как «char *») параметру типа «строка *» (также известному как [char **’)

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

Вот код:

#include <cs50.h>
#include <stdio.h>

string replace_letter(string argv[1]);

int main(int argc, string argv[])
{
    string replace = replace_letter(argv[1]);

    if (argc != 1)
    {
        return 1;
    }
    else
    {
        printf("%s\n", argv[1]);
    }
}

string replace_letter(string argv[1])
{

    switch(argv[1])
    {
        case a:
        printf(6);
        break;
    }
}

Нет ли другой ошибки или предупреждения от вашего компилятора? Как насчет printf(6); или case a:?

Gerhardh 06.04.2023 08:31

Этот код — прекрасная иллюстрация того, почему CS50 — такой плохой класс. Держитесь подальше от любых учебных материалов из Гарварда, они понятия не имеют, как правильно обучать программированию на C.

Lundin 06.04.2023 08:50

Я не согласен с утверждением кого-то другого не учиться у CS50. В целом, я думаю, что этот класс очень хорошо справляется с обучением C. Основная причина плохой репутации CS50 в Stack Overflow заключается в том, что он не сразу объясняет, что стоит за типом данных string. Однако вы узнаете об этом на 4-й неделе CS50.

Andreas Wenzel 06.04.2023 18:33
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы дали параметру функции replace_letter имя argv. Это название вводит в заблуждение, потому что параметр argv функции main представляет собой массив строк, тогда как параметр функции replace_letters должен быть одной строкой.

Если вы измените это вводящее в заблуждение имя на что-то более подходящее, например str (сокращение от «строка»), тогда станет яснее, что не так в вашей функции replace_letter:

string replace_letter(string str[1])
{

    switch(str[1])
    {
        case a:
        printf(6);
        break;
    }
}

Чтобы передать строку в качестве параметра функции replace_letter, вы должны объявить параметр следующим образом:

string replace_letter(string str)

Используя

string replace_letter(string str[1])

вместо этого вы заявляете, что в качестве параметра передается массив строк, и неверно подразумеваете, что длина этого массива равна 1 (хотя число 1 в этом случае игнорируется компилятором). Это не то, что вы хотите.

При объявлении массива число в [] указывает размер массива, тогда как в обычном выражении вне объявления число в [] указывает индекс в массиве, к которому вы хотите получить доступ. Вы, кажется, путаете эти два значения.

Если вы сделаете описанное выше изменение, а также соответствующим образом измените предварительное объявление функции, то ваш код должен выглядеть так:

#include <cs50.h>
#include <stdio.h>

string replace_letter(string str);

int main(int argc, string argv[])
{
    string replace = replace_letter(argv[1]);

    if (argc != 1)
    {
        return 1;
    }
    else
    {
        printf("%s\n", argv[1]);
    }
}

string replace_letter(string str)
{

    switch(str[1])
    {
        case a:
        printf(6);
        break;
    }
}

Это исправляет указанную вами ошибку.

Однако в программе есть еще другие проблемы, например

  • проверка значения argc только после вызова replace_letter(argv[1]),
  • писать case a: вместо case 'a':,
  • писать printf(6); вместо printf("6");,
  • преобразование только второго символа строки (str[1]) и
  • не использует оператор return в функции replace_letter, хотя эта функция объявлена ​​возвращающей значение.

Я оставлю это на ваше усмотрение, чтобы решить оставшуюся часть задания.

Другие вопросы по теме