Как заставить эту функцию останавливаться на N символов / - PullRequest
0 голосов
/ 03 апреля 2020

Итак, у меня есть это задание: взять содержимое одного текстового файла и скопировать его в другой. Мы должны переписать функцию по умолчанию strncpy, но немного по-другому. Вот то, что в лабораторных условиях написано в явном виде:

Эта функция заменяет функцию std :: strncpy. То есть он копирует содержимое s2 в s1, но не более чем на N символов. Подсказка: поскольку strlength (и std :: strlen) не считает символ с нулем в конце, не забудьте добавить это число на единицу при вызове strncopy (и std :: strncpy). Чтобы избежать нарушения сегментации, вы должны проверить, встречался ли завершающий нулем символ, прежде чем разыменовывать s2, чтобы скопировать данные в s1. Опять же, основывайте ваш код на указателе l oop.

Вот что у меня есть для моей функции:

void strncopy(char *s1, const char *s2, int N){

    // return if no memory is allocated to the s1
    if (s1 == NULL)
       NULL;

    // take a pointer pointing to the beginning of s1 string
    char *ptr = s1;

    // copy the C-string pointed by s2 into the array
    // pointed by s1
    while (*s2 != '\0'){

        if (*s1 == N){
            break;
        } 

     //   *s1 = *s2;
        s1++;
        s2++;

    }

    // include the terminating null character
    *s1 = '\0';
}

Проблема в том, что она кажется Если l oop не останавливается при достижении количества символов N.

Вот фрагмент моей основной функции, реализующей эту функцию:

int main(int argc, char *argv[]) {


  // check for four command line arguments
  // if not, print error message and bail out
    if (argc != 4){
        cerr<<"Error";
        return -1;;
    }

 // declare two streams: file1, file2
   fstream file1;
   fstream file2;

 // declare two char text line arrays
    char textline1[256];
    char textline2[256];

  if (strcompare(argv[1], "-copy") == 0) {
    //open file1 for reading
      file1.open(argv[2]);
      //open file2 for writing
      file2.open(argv[3]);

            //read text line 1 frome file1
      while (file1.getline(textline1, 256)) {
      // determine length of textline1
      char t1 = strlength(textline1);
     // copy textline1 to textline2
        strncopy(textline2, textline1, (t1+1));
     // write textline2 + newline to file2
        file2 << textline2 << '\n';
    }
  }

Вот текст в файле Я пытаюсь скопировать:

Журнал капитана, стандарт 3192.1. Предприятие находится на пути к звездному скоплению NG C 321. Цель - открыть дипломатические отношения c с известными там цивилизациями. Мы отправили сообщение Эминиару Седьмому, главному звену звездного скопления anet, сообщив им о наших дружественных намерениях. Мы ждем ответа.

И вот что я на самом деле копирую:

Журнал капитана, стандарт 3192.1. Предприятие находится на пути к звездному скоплению NG C 321. Цель - открыть дипломатические отношения c с известными там цивилизациями. Мы отправили сообщение Эминиару Седьмому, главному руководству звездного скопления anet, сообщив им о наших дружественных намерениях. Мы ждем ответа. n answer.cluster,.

Кто-нибудь знает, в чем моя проблема? Мне жаль, что это глупый вопрос, но с тех пор, как занятия пошли только в онлайн, получить помощь от инструктора и ТА очень сложно.

1 Ответ

0 голосов
/ 04 апреля 2020

В настоящее время у вас есть следующее, чтобы проверить длину:

if (*s1 == N){
    break;
} 

Однако, поскольку s1 не будет содержать длину (предположительно), вы сравниваете символы в s1 с N, что, вероятно, будет ложным (но будет UB, если s1 не был инициализирован).

Вы можете изменить условие while следующим образом:

while (*s2 != '\0' && N--)

Когда N достигает 0, его условие будет ложным и, следовательно, остановит l oop. Это предполагает, что N больше или равно нулю для начала.

Кроме того, чтобы добавить, у вас есть

// return if no memory is allocated to the s1
if (s1 == NULL)
    NULL;

Это не возвращает, на самом деле ничего не делает. Вы хотите сделать следующее:

if ( s1 == NULL )
    return;

PS: Вы можете рассмотреть возможность использования nullptr вместо NULL, если вы используете C ++ 11 или более позднюю версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...