Строки C++, копирование

242
18 марта 2018, 21:39

Задача: написать программу, которая скопирует одну строку в другую n-раз, написав две функции. Первая - в которой передается сам массив, вторая в которой передается адрес первого элемента.

Решение:

    #include "stdafx.h"
    #include <iostream>
    #include <locale>
    using namespace std;
    #define MAXLINE 80
    int copies(char s[MAXLINE], char s1[MAXLINE], int n)
    {
        int i, j;
        for (i = 0; s[i] != '\0'; i++);
        for (j = 0; s1[j] != '\0'; j++);
        if (n <= 0 || !((i+j-1) < MAXLINE))
        {
            return 0;
        }
        j--;
        while (n != 0)
        {
            int stop = i;
            for (i = 0; i < stop;i++)
            {
                j++;
                s1[j] = s[i];
            }
            n--;
        }
        j++;
        s1[j] = '\0';
        cout << "Строка: " << s1 << endl;
        return 1;
    }
    int copies2(char *s, char *s1, int n)
    {
        cout << "Начало выполнения с помощью адресации" << endl;
        int i, j;
        for (i = 0; s[i] != '\0'; i++);
        for (j = 0; s1[j] != '\0'; j++);
        if (n <= 0 || !((i + j - 1) < MAXLINE))
        {
            return 0;
        }
        //int first = j-1;
        j--;
        while (n != 0)
        {
            int stop = i;
            for (i = 0; i < stop; i++)
            {
                j++;
                s1[j] = s[i];
            }
            n--;
        }
        j++;
        s1[j] = '\0';
        //cout << "Строка: " << s1 << endl;
        cout << "Конец выполнения с помощью адресации" << endl;
        return 1;
    }
    int main()
    {
        setlocale(LC_ALL, "Russian");
        //передача с помощью массива
        char a[MAXLINE];
        char b[MAXLINE];
        cout << "Введите строку, которая будет скопирована" << endl;
        gets_s(a);
        cout << "Введите строку, в которую будет скопировано" << endl;
        gets_s(b);
        int some;
        cout << "Введите количество раз, сколько строка будет скопирована" << endl;
        cin >> some;
        if (!(copies(a,b,some)))
            cout << "Допущена ошибка. Строку можно копировать 1 раз и более";
        cout << "=====" << endl;
        cout << a << endl;
        cout << b << endl;
        cout << "=====" << endl;
        //адресация
        copies2(a, b, some);
        cout << a << endl;
        cout << b << endl;
        return 0;
    }

Вопрос: почему та функция, которая в которую передаются не указатели, а просто массив элементов изменяет значения в main? А также, правильно ли я передаю значения с помощью указателя на первый элемент?

Answer 1

char s[MAXLINE] читается так:

s - это указатель, который содержит адрес первого элемента такого массива, и что *(s + MAXLINE - 1) == '\0' Вы можете также написать функцию так:

 int copies(char s[], char s1[],  int n, const unsigned size = 80) 
   { 
     тут вместо MAXLINE будет фигурировать `size`
     и функция будет иметь вид для общего пользования
     а не только для массивов с фиксированным размером, а 
     также избавит вас от лишней головной боли с макросом
     ... 
   }

а это в свою очередь идентично следующему выражению:

int copies(char* s, char* s1,  int n, const unsigned size = 80) 
{ ... }

Надеюсь теперь все ясно...

Answer 2

В С и С++ при использовании массива в качестве аргумента функции тип аргумента будет неявно изменен на указатель. т.е. сигнатура первой функции на самом деле совпадает со второй:

int copies(char * s, char * s1, int n)

Соответственно и результаты одинаковые.

READ ALSO
задача на С++ &ldquo;обед&rdquo;

задача на С++ “обед”

Задача - Влад хочет взять с собой для ланча пару фруктовУ него есть a различных бананов, b различных яблок и c различных груш

208
Ошибка в иерархии классов 2

Ошибка в иерархии классов 2

Переделал вопрос Ошибка в иерархии классов

233
Чтение данных из файла в динамический массив структур - C++

Чтение данных из файла в динамический массив структур - C++

Подскажите пожалуйста, как можно осуществить чтение данных из файла в динамический массив структур?

342