Загрузка...

Указатели

Тема в разделе C/C++ создана пользователем walqed 22 ноя 2021. 151 просмотр

  1. walqed
    walqed Автор темы 22 ноя 2021 Окак:owodance::owodance: 208 5 дек 2018
    Дана последовательность, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 прописных латинских букв; между соседними словами - запятая, за последним словом - точка. Напечатать:эту же последовательность слов, но в обратном порядке.
    Написать с помощью указателей или адресной арифметики(какой легче будет)Вод код,но если написать запятые он не работает,еще он без указателей
    Код
    int main() {

    char str[] = { "car drive mouse." };
    int length = strlen(str);


    int i;
    for (i = length - 1; i >= 0; i--) {
    if (str[i] == ' ') {

    str[i] = '\0';

    printf("%s ", &(str[i]) + 1);
    }
    }

    printf("%s", str);

    return 0;
    }
     
    22 ноя 2021 Изменено
  2. brediska
    brediska 24 ноя 2021 Заблокирован(а) 2794 30 май 2021
    char str[] = { "car drive mouse." } ;
    Зачем тут фигурные скобки?
     
  3. brediska
    brediska 24 ноя 2021 Заблокирован(а) 2794 30 май 2021
    Вот ссылка на код, там его можно полностью скопировать:
    https://onlinegdb.com/iH6vW7pDJ

    #include iostream
    #include cstring
    /*Так как otvet.mail.ru не дает возможности написать угловые скобки, нужно в предложении выше дописать угловые скобки для слова iostream и cstring*/

    using std::cout;
    using std::endl;

    int main()
    {

    char str[] = { "car, drive, mouse." } ;

    int length = strlen(str);
    //Создаем указатель ptr и присваиваем ему адрес последнего символа строки: нуль-терминатора.
    char* ptr = str + length;
    for (int count = 0; count <=length; ++count)
    {
    //Дальше адресная арифметика. Вычитаем из адреса последнего символа такое количество count, которое при разности даст адрес символа запятой.
    //Когда такой адрес найдется, с него начнется вывод символов. Этим же адресом мы для удобства инициализируем новый указатель ptrCheck.
    //При каждой итерации, разность последнего адреса с счетиком count увеличивается на единицу. Вычитание происходит с символа нуль-терминатора.
    char* ptrCheck = ptr - count;// = ptr - count;

    if (*ptrCheck == ','||count==length)
    {
    //Указателю ptrCheck мы присваиваем адрес, значением которого является первая встречная запятая в строке str.
    //Чего нужно добиться:
    //Начать выводить символы с этого адреса, до тех пор, пока не встретится символ запятой или точки.
    ptrCheck = (ptr - count);
    //
    for (int count_1 = 0; ptrCheck[count_1] != '\0', ptrCheck[count_1] != '.'; ++count_1)
    {
    //Здесь дополнительно нужно написать, что если после текущего символа будет стоять запятая, то прежде чем выходить из цикла
    //текущий символ нужно допечатать. Это необходимо, потому что изначально наш счетчик count_1 начинается с символа запятой. И если
    //бы условием было задано «оканчивать цикл, если текущий элемент равен ','», то наша программа не выводила бы символы, стоящие после запятой..
    if (ptrCheck[count_1+1] == ',')
    {
    cout << ptrCheck[count_1];
    break;
    }
    else
    {
    if (ptrCheck[count_1] == ',' || ptrCheck[count_1] == ' ')
    ;
    else
    cout << ptrCheck[count_1];
    }
    }
    //После каждого вывода слова, выполняется следующая часть кода, которая выводит запятую или точку.
    // Когда значение count достигает конца, то при разности с длиной length это в результате дает 0: самый начальный элемент.
    // То есть когда значение длины length и count одинаково, то это дает в результате их разности 0 или нулевой элемент.
    if (count == length)
    cout << "." << endl;
    else
    cout << ", ";
    }
    }
    }
     
Top
Загрузка...