Linux / C Проверить, содержит ли символ пробелы, символ новой строки или символ табуляции

У меня есть GtkEntry, где пользователь должен ввести номер IP или имя хоста. Когда кнопка нажата, то, что пользователь ввел в запись, добавляется к символу. Как я могу программно проверить, содержит ли этот символ пробелы, символ новой строки или символ табуляции? Мне не нужно их удалять, просто чтобы знать, существуют ли они. Заранее спасибо!


person Community    schedule 25.06.2010    source источник
comment
Здесь у вас проблема с терминологией: char — это одиночный символ в некоторой компактной и простой кодировке (обычно ASCII). То, о чем вы спрашиваете, - это строка (часто помогает в char[] или char*). Кроме того, вы недооценили проблему. Я считаю, что вы хотите удалить или игнорировать (какие?) начальные и конечные пробелы и проверить, есть ли какие-либо внутренние пробелы. Нет?   -  person dmckee --- ex-moderator kitten    schedule 25.06.2010


Ответы (5)


Вам нужна функция strpbrk().

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

int check_whitespace (char *str)
{
  char key[] = { ' ', '\n', '\t', 0 };
  return strpbrk (str, key);
}
person PauliL    schedule 25.06.2010

Взгляните на процедуры классификации символов: man isspace.

person Nikolai Fetissov    schedule 25.06.2010
comment
Я не работаю, если первый символ char - пробел. - person ; 25.06.2010
comment
@Levo, char - это 8-битное целое число, обычно содержащее код ASCII для одной буквы. char* – это указатель на массив из них, который используется как строка в C. Упомянутые функции классификации работают с отдельными символами, а не со строками. . - person Nikolai Fetissov; 25.06.2010

Создайте массив символов, содержащий интересующие символы. Затем используйте strchr() для поиска наличия char в строке.

char charSet[] = { ' ', '\n', '\t', 0 };
char c;

// code that puts a character in c

if (strchr(charSet, c) != NULL)
{
    // it is one of the set
}
person Amardeep AC9MF    schedule 25.06.2010
comment
Пользовательский ввод был не одним символом, а строкой, такой как IP-номер или имя хоста. - person PauliL; 25.06.2010
comment
@PauliL: пользовательский ввод представляет собой строку. Однако вопрос был сформулирован так, чтобы спросить о символе, генерируемом при каждом нажатии клавиши. - person Amardeep AC9MF; 25.06.2010

Предположим, вы имеете в виду, что то, что вводится в GtkEntry, добавляется к массиву char (строка, в терминологии C, при условии, что она оканчивается нулем). Затем, чтобы проверить, содержит ли этот массив символов хотя бы один или несколько символов «пробел» (в соответствии с локалью, поэтому мы используем isspace),

char *array;
int i;
//..
bool contains_space = false;
for(i = 0; i < strlen(array); i++) {
  if ( isspace(array[i]) ) {
    contains_space = true;
    break;
  }
}
// return contains_space

который можно превратить, например, в функцию.

person ShinTakezou    schedule 25.06.2010

Вы можете рассмотреть функцию, подобную следующей, которая подсчитывает количество символов пробела в заданной строке, выдавая положительное целое число, если они найдены (т.е. ИСТИНА), ноль, если ничего не найдено (т.е. ЛОЖЬ) и -1 в случае ошибки.

#include <ctype.h>
static int
ws_count(char *s)
{
    int n = -1;
    if (s != NULL) {
        char *p;
        for (n = 0, p = s; *p != '\0'; p++) {
            if (isspace(*p)) {
                n++;
            }
        }
    }
    return n;
}
person bjg    schedule 25.06.2010