2010-05-24 3 views
2

sscanf (текст, «% s% s», название, компания);sscanf с несколькими пробелами?

анализирует 'ian mceknis', но также анализирует 'ian   mceknis' и так далее. Как я могу заставить это разобрать только первый? Он должен содержать только одно пространство не более.

спасибо.

+0

Можете ли вы уточнить ваш вопрос? Он анализирует X, но также анализирует X? Можете ли вы привести более конкретный пример? – Vicky

+0

Трудно понять, что вы просите, так как ваши два примера строки синтаксиса одинаковы. Приведите пример того, что не работает. –

+0

Я просто хочу разобрать 'ian mceknis blablabla' 'ian mceknis'. Но когда строка содержит больше места, синтаксический анализ будет по-прежнему действителен. Но я не хочу этого. Он должен анализировать только и только «ian mceknis» с указанными пробелами. 'ian mceknis blablabla' не может быть действительным. Надеюсь, вы поняли, что я пытаюсь сказать. Сожалею. – jamall55

ответ

2

Если вы хотите, чтобы он отклонил последний пример, вам придется перевернуть свою собственную функцию, чтобы найти/отклонить несколько пробелов.

Но я предполагаю, что вы действительно хотите удалить лишние пробелы. См.: How do I trim leading/trailing whitespace in a standard way?

+0

Да, но все же строка будет синтаксической. Вот почему я не могу этого сделать. – jamall55

+1

Тогда вам обязательно придется свернуть свою предварительную проверку на двойное пространство. Как насчет пробелов перед вашей строкой? Это разрешено? Как насчет двух пробелов в конце? Кроме того, это проблема домашней работы? Потому что с точки зрения удобства использования, как правило, менее желательно ограничивать параметры ввода. –

0

Вы не можете сделать это, используя только sscanf(), который имеет довольно базовую функциональность. Если вам действительно нужно принудительно выполнить это (не так ли?), То здесь может быть больше подходит regular expressions.

-1

Согласно определению sscanf, это абсолютно невозможно. Чтобы получить желаемый результат, я бы прочитал текстовую переменную вручную, выполнив поиск двух последовательных пробельных символов. Если найдено, замените второй символ пробела на 0 и затем вызовите sscanf.

+0

Замена второго символа пробела на «0» приведет к тому, что в приведенном примере команда 'company' будет установлена ​​на' 0mceknis'. -1. –

+0

j_random_hacker: Знаете ли вы разницу между 0 и «0»? –

+0

Я задавался вопросом, имел ли вы значение 0, как в символе nul (все бит-off). В приведенном примере конец строки будет прерван до 'mceknis' ​​(т. Е. Входная строка теперь' ian 'с одним пробелом в конце), поэтому' sscanf() 'не удастся. –

0

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

Так я хотел бы изменить:

sscanf(text, "%s %s", name, company); 

к:

char space[2] = "\0\0" 
sscanf(text, "%s%2[ ]%s", name, space, company); 
if(space[1] != '\0') { 
    //there was an extra space, handle it however 
} 
Смежные вопросы