Задача: написать программу, которая скопирует одну строку в другую 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? А также, правильно ли я передаю значения с помощью указателя на первый элемент?
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)
{ ... }
Надеюсь теперь все ясно...
В С и С++ при использовании массива в качестве аргумента функции тип аргумента будет неявно изменен на указатель. т.е. сигнатура первой функции на самом деле совпадает со второй:
int copies(char * s, char * s1, int n)
Соответственно и результаты одинаковые.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Задача - Влад хочет взять с собой для ланча пару фруктовУ него есть a различных бананов, b различных яблок и c различных груш
Подскажите пожалуйста, как можно осуществить чтение данных из файла в динамический массив структур?