Чтение ввода пользователя и проверка строки - PullRequest
2 голосов
/ 13 февраля 2011

Как можно проверить чтение в строке для подстроки в C?

Если у меня есть следующее

char name[21];
fgets(name, 21, stdin);

Как проверить строку для серии подстрок?

Как проверить подстроку перед символом?Например, как можно проверить подстроку перед знаком =?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2011

Остерегайтесь strtok(); это не повторный вход. Среди прочего, это означает, что если вам нужно вызвать ее в одной функции, а затем вызвать другую функцию, и если эта другая функция также использует strtok(), ваша первая функция испорчена. Он также записывает NUL ('\0') байтов через разделители, поэтому он изменяет входную строку по мере ее поступления. Если вы ищете более одного символа-терминатора, вы не можете сказать, какой из них был найден. Кроме того, если вы пишете библиотечную функцию для использования другими, но ваша функция использует strtok(), вы должны задокументировать тот факт, что вызывающие вас функции не будут смущены сбоями их собственного кода, strtok() после вызова вашей функции. Другими словами, это ядовито; если ваша функция вызывает strtok(), это делает вашу функцию неиспользуемой, в общем; аналогично, ваш код, который использует strtok(), не может вызывать функции других людей, которые также используют его.

Если вам все еще нравится идея функциональности - некоторым это нравится (но я почти всегда избегаю ее) - тогда поищите strtok_r() в вашей системе. Это повторно входящий; он принимает дополнительный параметр, который означает, что другие функции могут использовать strtok_r() (или strtok()), не влияя на вашу функцию.

Существует множество альтернатив, которые могут быть уместны. Очевидные для рассмотрения следующие: strchr(), strrchr(), strpbrk(), strspn(), strcspn(): ни один из них не изменяет анализируемые строки. Все они являются частью стандарта C (как и strtok()), поэтому они в основном доступны везде. Поиск материала до того, как один символ предлагает использовать strchr().

1 голос
/ 13 февраля 2011

Вы можете использовать strtok, но это не реентерабельно и уничтожает исходную строку.Другие (возможно, более безопасные) функции, на которые стоит обратить внимание: strchr, strstr, strspn и, возможно, mem* варианты.В общем, я избегаю strn* вариантов, потому что, хотя они и выполняют «проверку соединения», они все еще полагаются на нулевой терминатор.Они могут потерпеть неудачу в допустимой строке, которая оказывается длиннее, чем вы ожидали иметь дело, и они фактически не предотвратят переполнение буфера, если вы не знаете размер буфера.Лучше (ИМХО) игнорировать терминатор и точно знать, с каким объемом данных вы работаете каждый раз, когда работают функции mem*.

1 голос
/ 13 февраля 2011

Используйте strtok () , чтобы разбить строку на токены.

char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
  printf ("Substring: %s\n",pch);
}

Вы можете продолжать звонить strtok(), чтобы найти больше строк после =.

...