Sscanf читать до конца строки - PullRequest
2 голосов
/ 14 мая 2019

Мне нужно разбить строку на две части, первый столбец строки - это первая часть, а остальная часть строки - вторая часть.Первая часть должна быть сохранена в first_str, а вторая часть в rest_str.

Я использую sscanf для достижения результата, мне удалось получить желаемый результат на следующем примере, когда sentence[] не содержит буквальных символов \n.

Короче говоря, мне нужно знать спецификатор формата до конца входной строки.До сих пор я был в состоянии заставить его работать до тех пор, пока не будет замечен \n, но больше не могу его использовать.Может ли кто-нибудь помочь в чтении до конца строки, а не до \n.

Вот уменьшенный пример:

#include <stdio.h>

int main ()
{
  char sentence []="abc@xyz.com foo bar foobar\nhey there";
  char first_str [200];
  char rest_str [200];

  //sscanf (sentence,"%s %99[^\0]",first_str,rest_str);
  sscanf (sentence,"%s %99[^\n]",first_str,rest_str);

  printf ("first column is %s\nevertyhing else is %s\n",first_str,rest_str);

  return 0;
}

Желаемый результат:

first column is abc@xyz.com
evertyhing else is foo bar foobar\nhey there

ИЛИ

first column is abc@xyz.com
evertyhing else is foo bar foobar
hey there

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

sscanf поддерживает спецификатор формата %n для возврата количества использованных символов.Вы можете использовать его, чтобы определить, сколько времени префикс sscanf потребляет.

Следующий код устанавливает rest_str для указания "остальной части строки":

int main ()
{
  char sentence []="abc@xyz.com foo bar foobar\nhey there";
  char first_str [200];
  char *rest_str;

  int n = 0;
  sscanf (sentence,"%s %n",first_str,&n);
  rest_str = sentence + n;

  printf ("first column is %s\nevertyhing else is %s\n",first_str,rest_str);

  return 0;
}
2 голосов
/ 14 мая 2019
  1. Найти первый вхождение разделителя в строке. Разделитель здесь - это разделитель слов, пробел в вашем случае. Но алгоритм легко расширить, чтобы он включал табуляцию, переводы строк, символы перевода формы и т. Д.
  2. Печать нулевого байта там.
  3. Первый столбец начинается с начала предложения до тех пор, пока не будет записан нулевой байт. Второй столбец начинается после разделителя.

Код ниже дает ожидаемый результат:

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

int main ()
{
    char sentence []="abc@xyz.com foo bar foobar\nhey there";

    char *pnt = strpbrk(sentence, " ");
    if (pnt == NULL) {
        printf("first column is %s\n", sentence);
        printf("there is no second column\n");
        return 0;
    }
    *pnt = '\0';
    pnt++;
    // omit multiple spaces
    while (*pnt != '\0' && *pnt == ' ') pnt++;
    if (*pnt == '\0') {
        printf("first column is %s\n", sentence);
        printf("there is was no second column, tho multiple spaces were found\n");
        return 0;
    }

    char *first_str = sentence;
    char *rest_str = pnt;

    printf ("first column is %s\nevertyhing else is %s\n", 
        first_str, 
        rest_str);

    return 0;
}
...