Основной вопрос string.h (C ++) - PullRequest
0 голосов
/ 07 мая 2011

У меня есть простой файл C ++, и он удаляет символы из текстового файла, хотя я хотел бы изменить его.

Текстовые строки следующие:

XXXXX | YYYYYYYYYYYYYYYYYYY

При текущем удаляет

| YYYYYYYYYYYYYYYYYYYY

из строки, хотя я бы хотел ее удалить:

XXXXX |

вместо этого, так что, по сути, уберите левую сторону, а не правую.

Код, который у меня есть на данный момент:

#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
    char s[2048], *pos=0;
    while (fgets(s, 2048, stdin))
    {
        if (pos = strpbrk(s, "|\r\n"))
            *pos='\0';
        puts(s);
    }
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 07 мая 2011

Вы редко должны использовать <string.h> в программе на C ++.

Возможно, вы должны использовать <string>;возможно, вы можете использовать <cstring>.

Это даже не глядя на ваш код - просто забудьте, что <string.h> существует, если вы пишете на C ++;это заголовок C для функциональности C.Аналогичные комментарии относятся к <stdio.h>;это заголовок C, и его редко следует использовать в C ++ (обычно с использованием <iostream> или иногда <cstdio>).

Ваша main() функция требует тип возврата int (как в C ++, так иC99).Поскольку вы хотите получить информацию после канала, вы можете написать (совершенно правильную программу на C (C89, C99) - вообще не используя никаких отличительных особенностей C ++, хотя компилятор C ++ также примет ее):

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char s[2048];
    while (fgets(s, sizeof(s), stdin))
    {
        char *pos = strpbrk(s, "|\r\n");
        if (pos != 0)
            fputs(pos+1, stdout);
    }
    return 0;
}

Использование fputs() вместо puts(), чтобы избежать двойного интервала вывода.

1 голос
/ 07 мая 2011

Используйте другой массив, и пока вы читаете XXXXX, назначьте символы в целевом массиве.Когда вы сталкиваетесь с |в кислой исходной строке присвойте '\ 0' в строке назначения.Или, если вы не хотите использовать другой вспомогательный массив, вам нужно сдвинуть начало части с 'Y' в начало массива.Для этого вы прикрепляете один счетчик к основанию массива (i) (где вы хотите, чтобы следующая часть была сдвинута), а затем сканируете строку до части с первым 'Y', сохраняете ее для другого счетчика (j),Теперь, когда j

Это сдвиговая версия, использующая только один массив.

#include <stdio.h>
#include <string.h>

int main (void)
{
  char s[1024];
  int i, j, n;
  printf ("\ns: ");
  scanf (" %[^\n]", s);
  n = strlen (s);

  i = j = 0;
  /* Find the dilimeter index */
  while ((j < n) && s[j] != '|')
   j++;
  /* Move the other side of the dilimeter to
   * the begining pointed by index i. note that
   * we avoid the delimeter to be copied by 
   * pre-incrementing the counter j
   */
  while (j<n)
   s[i++] = s[++j];

  s[i] = '\0'; /* Terminate String */

  printf ("\n%s\n", s);
  return 0;
}

Версия с двумя массивами в этом случае практически одинакова.

0 голосов
/ 07 мая 2011

strpbrk() возвращает местоположение '|', поэтому просто используйте его для вывода обрезанной слева строки. Следующий выводит |YYYYYYYYYYYYYYYY. Вам нужно будет немного изменить его, чтобы удалить ведущий '|'.

#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
    char s[2048], *pos=0;
    while (fgets(s, 2048, stdin))
    {
        if (pos = strpbrk(s, "|\r\n"))
            puts(pos);
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...