Консультация № 144390
19.09.2008, 14:11
0.00 руб.
0 5 5
Здравствуйте ещё раз. Напишите пожалуйста программу, которая копирует N первых символов строки
в другую строку - без использования строковых функций и с использованием указателей.
Огромное СПАСИБО.

Обсуждение

Неизвестный
19.09.2008, 14:52
общий
это ответ
Здравствуйте, k800ise!
В этой задачи нам необходимо посимвольно переписать n символов из одной строки в другую. Переход по символам строки осуществляется точно также, как по элементам массива (поскольку строки в си - массивы символов), т.е. либо при помощи индексации (str[i]), либо, что менее удобно в большинстве случаев, при помощи работы с указателями (*str - первый символ, *str+1 - второй символ и т.д.). Реализация Вашей задачи в приложении, остальное, думаю, ясно из комментариев.
Удачи!

Приложение:
#include "string.h" //Библиотека для работы функции strlen
#include "iostream.h" //Библиотека для работы с cin
#include "conio.h" //Библиотека для getch

int main(int argc, char* argv[])
{
printf("Vvedite stroku (ne bolee 50 simvolov)\n");
char *str1= new char [51]; //Выделяем память под строки (максимум - 50 символов + конец строки)
char *str2= new char [51];
int n;
cin >> str1; //Считываем строку
printf("\nVvedite N (ne bolee %i)\n", strlen (str1));
cin >> n; //Считываем число
int i;
char *s1=str1, *s2=str2; //Дублируем указатели на строки, чтобы не испортить исходные
for (i=0; i<n; i++) { //В цикле на n итераций
*s2 = *s1; //Переписываем символ
*s1++; *s2++; //Переходим на следующий символ строки
}
*s2= '\0'; //Добавляем конец строки
printf ("\n%s", str2); //Выводим результат
delete [] str1; //Очищаем память
delete [] str2;
getch(); //Ждём реакции
return 0;
}
Неизвестный
19.09.2008, 15:22
общий
это ответ
Здравствуйте, k800ise!

я оформлю в виде функции (см приложение)

void copynstr(char* dst, const char* src, int maxlen);
перый параметр куда копировать
второй - откуда
третий - размер буфера для приема строки, что бы не было преполнения


Приложение:
void copynstr(char* dst, const char* src, int maxlen)
{
if(maxlen <= 0 || !*dst || !*src)
return;

while(--maxlen && *src)
*dst++ = *src++;
*dst = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
char source[] = "source string";
char dest[20];

copynstr(dest, source, sizeof(dest)/sizeof(*dest));
}

Неизвестный
19.09.2008, 15:32
общий
это ответ
Здравствуйте, k800ise!
Данная фнкция копиует n символов строки src в стрку dst с использованием указателей

void str_copy(char* dst, char* src, int n)
{
while (n--)
*dst++ = *src++;
}
Неизвестный
19.09.2008, 16:37
общий
это ответ
Здравствуйте, !

Комментированый код С++ программы в приложении. Будут вопросы - задавайте в мини-форум.

Приложение:
//Потоковый ввод/вывод
#include <iostream>
//Заголовок для обеспечения работы с функкцией gets()
#include <cstdio>

using namespace std;

int main()
{
//Объявляем символьные массивы по сто символов с именами "str1" и "str2"
char str1[100];
char str2[100];

//Объявляем переменную, которая хранит целое число
int N;

//Приглашение ввести строку
cout << " Vvedyte stroku: ";

//Используем функцию gets() для ввода строки
gets(str1);

//Приглашение ввести значение N
cout << endl << " Vvedyte znachenye N: ";

//Обеспечиваем ввод значения N с клавиатуры
cin >> N;

cout << endl << " Vy vvely stroku: " << str1;

cout << endl << endl << " " << N << " pervuh symvolov stroku: ";

//Объявляем указатель на char-значение
char *start;

/*Присваиваем указателю "start" адрес начала массива "str1", так как в С++ неиндексированное
имя массива - это указатель на его первый элемент */
start = str1;

//Объявляем переменную целого типа "i" и присваиваем ей значение 0.
int i = 0;

/*Цикл, в котором формируется строка "str2". Т.е. ранее мы присвоили указателю "start" адрес
начала массива "str1", и пока значение переменной "i" не будет ровняться значению
"N" - будет осуществляться инкрементирование указателя, т.е. увеличение на 1,
т.е. переход к следующей букве массива "str1" и пошаговое присваивание этих букв
(на которые ссылается указатель) массиву "str2" */

while(i != N)
{
str2[i] = *start;

i++;

start++;
}

//"Обрезаем 0-символом остальную часть массива, которая нам НЕ нужна"
str2[N] = '\0';

//Выводим на экран массив "str2";
cout << str2 << endl << endl;

return 0;
}
Неизвестный
20.09.2008, 00:06
общий
это ответ
Здравствуйте, k800ise!
Код в приложении. Функция копирования первых n символов (funk()) определена за пределами main()


Приложение:
//Ввод-вывод
#include <iostream>

//Позволяет использовать функцию gets()
#include <stdio.h>

using namespace std;

//Функция копирования n первых символов
void funk(int,char*,char*);

int main()
{
//Ввод строки символов
char str[50];
cout<<"BBeduTe CTPOKY: ";
gets(str);

//Ввод количества копируемых символов
int n;
cout<<"BBeduTe KOLu4ECTBO KOPuPYEMbIX CuMBOLOB: ";
cin>>n;

//Массив для хранения скопированых символов
char* buf=new char[n+1];

//Вызов функции копирования
funk(n,str,buf);

//Вывод скопированой строки
for (int i=0;(i<n)&&(buf[i]);i++) cout<<buf[i];

//Очистка памяти
delete [] buf;

return 0;
}

void funk(int n,char* p,char* q)
{
for(int i=0;((i<n)&&p[i]);i++){
q[i]=p[i];
}
}
Форма ответа