2010-10-26 2 views
5

scanf ("% s", str) этого не сделает. Он перестанет читать в первом пространстве. gets (str) не работает ни при большой строке. Есть идеи?Как я могу прочитать строку с пробелами в C?

+2

'gets' никогда не работает. Это неотъемлемая ошибка при использовании 'gets'. Используйте 'fgets'. –

+0

Может быть, это моя версия c, которая не будет приниматься вообще ... Спасибо! – Johny

+0

@Johnny: Предупреждение R от использования 'gets()' связано с тем, что с его использованием в вашем коде обнаружено * огромное * отверстие безопасности, а не то, что у вашего конкретного компилятора есть проблема с ним (он не должен: 'получает() 'является частью C с самого начала). Он устарел от C99 и больше не должен использоваться. –

ответ

13

fgets с STDIN в качестве потока файлов. Затем вы можете указать количество данных, которое вы хотите прочитать, и куда их поместить.

+0

На самом деле это примерно так: – Johny

+0

fgets (str1, 100, stdin); fgets (str2, 100, stdin); Я не буду запрашивать первую строку. Он переходит непосредственно ко второму. Спасибо за быстрый ответ. – Johny

+0

Я не уверен, что означает ваш комментарий - что-то не работает? –

1

Когда вы хотите прекратить чтение? В EOF, у определенного персонажа или что?

Вы можете прочитать определенное количество символов с% с

гр Соответствует последовательности символов ширины количества (по умолчанию 1); следующий указатель должен быть указателем на символ, и должно быть достаточно места для всех символов (не добавляется завершающий NUL). Обычный пропущен ведущий белый пробел. Чтобы пропустить пробел , сначала используйте явное пространство в формате.

Вы можете прочитать определенные символы (или до исключенных из них) с% [

[Соответствует последовательности непустой символов из заданного набора принятых символов; следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов в строке , плюс завершающий символ NUL. Обычный пропуск ведущего белый пространство подавлено. Строка должна состоять из символов в (или нет) конкретного набора; набор определяется символами между открытой скобой [символ и закрывающая скобка] charac- ter. Набор исключает эти символы, если первый символ после того, как открытая скобка представляет собой огибающую ^. Чтобы включить в комплект кронштейн , сделайте его первым символом после открытого кронштейна или обводки; любая другая позиция закончит набор. Символ дефиса - также особенный; при размещении между двумя другими символами он добавляет все входящие символы в набор. Чтобы включить дефис, сделайте его последним символом перед окончательным скобкой . Например, `[^] 0-9-] 'означает набор ` `все за исключением закрывающей скобки, от нуля до девяти и дефиса' '. строка заканчивается с появлением символа не в (или, с кружочками cumflex, в) установить или когда ширину поля

+0

Мне просто не нужны пробелы между строкой. Я попробовал scanf ("% [^ \ n]", str); но не работает. Спасибо, в любом случае! – Johny

+0

Итак, вы хотите прочитать целую строку? –

+0

Я предполагаю, но это означает, что до 79 символов, не так ли? Мне нужна строка, которая может быть больше. – Johny

2

Создайте свою собственную функцию для чтения строки. Вот то, что вы в основном должны сделать:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

Реализация может быть немного сложнее :-)

Вы должны думать о том, что вам нужно передать в функцию (по крайней мере, адрес массив и его размер); и что функция возвращает, когда все «работает» или когда происходит ошибка.Вам нужно решить, что такое ошибка (строка длиной 10 Гбайт без ошибки «\ n»?). Вам нужно решить, как вырастить массив.


Редактировать

На самом деле это может быть лучше fgetc вместо fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

Чтобы прочитать строку с пространством вы можете сделать следующее:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch' должно быть' int', чтобы отличить 'EOF' от всех остальных' char'. Как и сейчас, 'while ((ch = getchar())! = '\ N')' является бесконечным циклом, если 'EOF' должен быть возвращен из' getchar() '. – chux

4
char str[100]; 

Попробуйте

scanf("%[^\n]s",str); 

или это

fgets(str, sizeof str, stdin)) 
+0

1) Нет '' '' ''% [^ \ n] s "'. 2) 'scanf ("% [^ \ n] ... 'ничего не скажет и ничего не сохранит в' str', если вход '' \ n "'. 3) 'scanf ("% [^ \ n] .. . 'не защищает от большого ввода. 4)' scanf ("% [^ \ n] ...' оставляет '' \ n'' в 'stdin'. – chux

Смежные вопросы