2013-05-09 5 views
1

Я узнал о некоторых умных функциях C, которым требуется цикл, но не должен работать тело цикла (например, strcpy()), и поэтому это только одна строка.C Замена символа в одной строке

Просто из интереса, есть ли способ уменьшить замену всех символов новой строки \n пробелами в одну строку следующим образом?

На данный момент я получил

char* newline_index; 
while (newline_index = strchr(file_text, '\n')) 
{ 
    *newline_index = ' '; 
} 

я хотел бы сделать что-то вроде этого:

while (*strchr(file_text, '\n') = ' '); 

, но, конечно, когда strchr возвращает нуль Постараюсь разыменовывать нуль указатель.

Я знаю, что использование strchr изменяет, потому что в нем содержится больше кода, но я бы хотел посмотреть, есть ли способ для одной линии, чтобы использовать это только с использованием стандартных функций c.


Edit: С некоторой помощью, это лучшее, что я придумал:

char* newline_index; 
while ((newline_index = strchr(file_text, '\n')) && (*newline_index = ' ')) 
+0

Если файл большой, то это будет очень медленным, чтобы сделать это, ' strchr' сканирует файл, поэтому потребуется время для сканирования файла снова и снова, вместо того, чтобы сканировать его один раз. – Guy

+0

Это правда, но помните, что моя цель - сжатие, а не скорость. – Miguel

+1

Вы хотите что-то вроде этого: char * newline_index; while ((newline_index = * strchr (file_text, '\ n')) && (newline_index!= NULL) && (newline_index = '')); ?? –

ответ

3

я предлагаю следующий код. Следующий код в одной строке и избежать вызова функции strchr():

char* p = file_text; 
while(*p!='\0' && (*p++!='\n' || (*(p-1) = ' '))); 

Вы также можете использовать for цикл:

char* p; 
for(p = file_text; *p!='\0' && (*p!='\n' || (*p = ' ')); p++); 

Для решения вы предоставляете:

char* newline_index; 
while ((newline_index = strchr(file_text, '\n')) && (*newline_index = ' ')) 

Вызов strchr() таким образом сделает начинать с начала вашего file_text каждый раз, когда вы хотите найти '\n'.

Я предлагаю изменить его на:

char* newline_index = file_text; 
while ((newline_index = strchr(newline_index, '\n')) && (*newline_index = ' ')) 

это позволит strchr() продолжить поиск в '\n' от последней позиции, а не с самого начала.

И даже с этой оптимизацией требуется также время вызова функции strchr(). Так вот почему я предложил решение без вызова strchr() функции

+0

+1, первое предложение выполняется быстрее, когда строки коротки (и на моей машине, которая имеет unoptimized 'strchr') – nneonneo

+0

+1 Отличное предложение по оптимизации того, что у меня было. Но в основном мне нравится этот ответ, потому что вам удалось это сделать без вызовов функций. – Miguel

3

Вот довольно эффективный и простой способ сделать это:

for(char *p = file_text; (p = strchr(p, '\n')); *p = ' ') 
    ; 
+0

хорошее предложение +1 – MOHAMED

+0

Обратите внимание, что объявление 'p' в цикле' for' не переносится для всех gcc – MOHAMED

+0

@MOHAMED: Это законный C99, и его должен принять любой недавний компилятор, кроме MSVC. – nneonneo

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