Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Serps
0 / 0 / 0
Регистрация: 06.07.2010
Сообщений: 10
#1

реализовать strncat(s1,s2,n) - C++

07.07.2010, 12:44. Просмотров 1325. Ответов 9
Метки нет (Все метки)

Здраствуйте. Нужна ваша помощь!
Нужна прога, берущая из файла2 n первых символов и приписывающая их в концевик файла1.
Реализовать используя: strncat(s1,s2,n); //копирует первые n символов из строки s2 в s1
Помните, что указываемый массив-приемник s1 должен быть достаточного
размера, чтобы содержать строку-источник s2, иначе программа может быть
испорчена. Если n больше, чем длина строки в s2, то в s1 в конце записывает "-1"-в роли диагностического сообщеия(без записи символов s2);

Жду вашей помощи
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2010, 12:44     реализовать strncat(s1,s2,n)
Посмотрите здесь:

Strncat - C++
Пытаюсь с помощью этой функции соединить две строки, ничего не получается помогите плз я уже просто не понимаю: Вот код там все...

Функция strncat - C++
Написать вариант функции strncat(s,t,n), которая копирует не более n букв стринга t в конец стринга s и программу для проверки...

аналог функции STRNCAT(). - C++
Написать и протестировать аналог функции STRNCAT(),просто на Си. #include<stdio.h> #include<string.h>

аналог функции STRNCAT(). - C++
Написать и протестировать аналог функции STRNCAT(). #include <stdio.h> #include <conio.h>

аналог функции STRNCAT() - C++
Написать и протестировать аналог функции STRNCAT().

Компилятор ругается на функцию strncat - C++
#include <iostream> #include <string> using namespace std; long p,x,i,j,k,d,l; char t,s; void prefix() {

Применение strncat в VS 2008 выдает ошибку.. - C++
#include <iostream> #include <string> int main() { char *text = "Oshybka odnogo - urok drugomu", *from = "urok", *to =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
07.07.2010, 15:44     реализовать strncat(s1,s2,n) #2
Считываешь из первого файла в строку... Считываешь из второго файла в другую строку... Конкатинируешь 1 и 2 строку, беря только n символов из 2 строки... Если n больше конкатинируешь с -1... Или просто выдаешь ошибку. Записываешь 1 строку обратно в 1 файл. Дерзай.

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <cstring>
#include <cstdlib>
int main()
{
    char Str[256];
    char Str2[256];
    int n;
    FILE*f1;
    f1=fopen("D:\\First.txt", "r");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    while (!feof(f1))
        fgets(Str, 256, f1);
    FILE*f2;
    f2=fopen("D:\\Second.txt", "r");
    if (f2==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    while(!feof(f2))
        fgets(Str2, 256, f2);
    std::cout<<"Enter n\n";
    std::cin>>n;
    if (n>strlen(Str2))
        strcat(Str, "-1");
    else
        strncat(Str, Str2, n);
    std::cout<<Str<<'\n';
    fclose(f1);
    f1=fopen("D:\\First.txt", "w");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    fputs(Str, f1);
    return 0;
}
Добавлено через 15 минут
Можно еще так. Дабы учитывать что первая строка может переполниться

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cstring>
#include <cstdlib>
int main()
{
    char Str[256];
    char Str2[256];
    int n;
    FILE*f1;
    f1=fopen("D:\\First.txt", "r");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    while (!feof(f1))
        fgets(Str, 256, f1);
    FILE*f2;
    f2=fopen("D:\\Second.txt", "r");
    if (f2==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    while(!feof(f2))
        fgets(Str2, 256, f2);
    char*Ptr;
    Ptr=new char[strlen(Str)+strlen(Str2)+1];
    strcpy(Ptr,Str);
    std::cout<<"Enter n\n";
    std::cin>>n;
    if (n>strlen(Str2))
        strcat(Ptr, "-1");
    else
        strncat(Ptr, Str2, n);
    std::cout<<Ptr<<'\n';
    fclose(f1);
    f1=fopen("D:\\First.txt", "w");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    fputs(Ptr, f1);
    return 0;
}
Добавлено через 1 минуту
Собственно. Строки можешь сделать и по 1000 символов, если надо.
Можно конечно и динамически под каждую строку выделять. Но сейчас мне лень.

Добавлено через 10 минут
Динамик... Много наверчено вцелом. Можешь некоторое убрать, если поймешь что

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <cstring>
#include <cstdlib>
int main()
{
    char*Str;
    char*Str2;
    //char Str[256];
    //char Str2[256];
    int n=0;
    int m=0;
    FILE*f1;
    f1=fopen("D:\\First.txt", "r");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    while (!feof(f1))
    {
        fgetc(f1);
        m++;
    }
    fclose(f1);
    f1=fopen("D:\\First.txt", "r");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    Str=new char[m+1];
    while(!feof(f1))
        fgets(Str, m, f1);
    FILE*f2;
    f2=fopen("D:\\Second.txt", "r");
    if (f2==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    m=0;
    while(!feof(f2))
    {
        fgetc(f2);
        m++;
    }
    fclose(f2);
    f2=fopen("D:\\Second.txt", "r");
    if (f2==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    Str2=new char[m+1];
    while (!feof(f2))
        fgets(Str2, m, f2);
    char*Ptr;
    Ptr=new char[strlen(Str)+strlen(Str2)+1];
    strcpy(Ptr,Str);
    std::cout<<"Enter n\n";
    std::cin>>n;
    if (n>strlen(Str2))
        strcat(Ptr, "-1");
    else
        strncat(Ptr, Str2, n);
    std::cout<<Ptr<<'\n';
    fclose(f1);
    f1=fopen("D:\\First.txt", "w");
    if (f1==0)
    {
        std::cout<<"No file\n";
        exit(1);
    }
    fputs(Ptr, f1);
    return 0;
}
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
07.07.2010, 16:51     реализовать strncat(s1,s2,n) #3
Цитата Сообщение от Serps Посмотреть сообщение
Если n больше, чем длина строки в s2, то в s1 в конце записывает "-1"-в роли диагностического сообщеия(без записи символов s2);
Это что за непонятный велосипед получится? Вот Вам реализация strncat() из исходников биэсдишного gcc
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
 * Concatenate src on the end of dst.  At most strlen(dst)+n+1 bytes
 * are written at dst (at most n+1 bytes being appended).  Return dst.
 */
char *
strncat(char * __restrict dst, const char * __restrict src, size_t n)
{
        if (n != 0) {
                char *d = dst;
                const char *s = src;
 
                while (*d != 0)
                        d++;
                do {
                        if ((*d = *s++) == 0)
                                break;
                        d++;
                } while (--n != 0);
                *d = 0;
        }
        return (dst);
}
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.07.2010, 22:22     реализовать strncat(s1,s2,n) #4
easybudda, ты вопрос в первой теме прочитай внимательно.
strncat() уже есть
Хохол
07.07.2010, 22:29
  #5

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
из исходников биэсдишного gcc
Цитата Сообщение от easybudda Посмотреть сообщение
return (dst);
Фигасе, а я думал, что return со скобками пишут только мои одногруппницы.

easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
07.07.2010, 22:56     реализовать strncat(s1,s2,n) #6

Не по теме:

Цитата Сообщение от Хохол Посмотреть сообщение
Фигасе, а я думал, что return со скобками пишут только мои одногруппницы.
Может это они и писали, просто Вам не говорят?



Цитата Сообщение от odip Посмотреть сообщение
strncat() уже есть
это где это есть такая реализация strncat(), которая возвращает "-1", если символов в копируемой строке меньше, чем передано в параметре?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
07.07.2010, 22:58     реализовать strncat(s1,s2,n) #7
easybudda, Нету такого) Но ведь проверку-велосипед никто не мешает сделать)
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
07.07.2010, 23:20     реализовать strncat(s1,s2,n) #8
Вот ещё дебиановская реализация. Чудна'я какая-то, за то return без скобок
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
extern void abort(void);
extern int inside_main;
 
typedef __SIZE_TYPE__ size_t;
 
char *
strncat (char *s1, const char *s2, size_t n)
{
  char *dest = s1;
  char c = '\0';
#ifdef __OPTIMIZE__
  if (inside_main)
    abort();
#endif
  while (*s1) s1++;
  c = '\0';
  while (n > 0)
    {
      c = *s2++;
      *s1++ = c;
      if (c == '\0')
    return dest;
      n--;
    }
  if (c != '\0')
    *s1 = '\0';
  return dest;
}
кстати, "-1" тоже не возвращает...
Serps
0 / 0 / 0
Регистрация: 06.07.2010
Сообщений: 10
07.07.2010, 23:37  [ТС]     реализовать strncat(s1,s2,n) #9
т.е. например если s1 "abc" ; s2 "xy" ; n = 4 ==> s1 "abcxy00" ??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2010, 23:47     реализовать strncat(s1,s2,n)
Еще ссылки по теме:

Напишите варианты библиотечных функций strncpy, strncat и strncmp - C++
вот такая задача, Напишите варианты библиотечных функций strncpy, strncat и strncmp, которые оперируют с первыми символами своих...

Нужен аналог функции strncat - C (СИ)
Напишите свою реализацию этой функции.

Необходимо реализовать шаблонный класс Array, и грамотно реализовать push_back - C++
Необходимо реализовать шаблонный класс Array, параметризируемый типом хранимых элементов. Класс Array представляет собой...

Как правильно реализовать доступ во внутреннюю (корпоративную) сеть из внешней и реализовать аутентификацию - C# MVC
Доброго времени суток. Вобщем суть вопроса... есть настроенный в корпоративной среде Sql Server Reporting Service (сервер отчетов) на...

Игра в кости: реализовать мини-казино; реализовать возможность игры 2 человек между собой - C++
Уважаемые форумчане! Подскажите, пож-та, где можно посмотреть программу игры в кости, но не человека и компьютера, а двух человек...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
07.07.2010, 23:47     реализовать strncat(s1,s2,n) #10
Serps, с какого перепуга? Вторая строка копируется в хвост первой, пока либо не кончатся символы во второй строке, либо не скопируется n символов ( + '\0' )
Yandex
Объявления
07.07.2010, 23:47     реализовать strncat(s1,s2,n)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru