2013-05-09 8 views
1

J'ai appris quelques-unes des fonctions C intelligentes qui nécessitent une boucle, mais pas de corps de boucle à exécuter (comme strcpy()), et ne sont donc qu'une longue ligne. Juste par intérêt, est-il possible de réduire le remplacement de tous les caractères de nouvelle ligne \n avec des espaces à une ligne comme celle-ci?Caractère C Remplacer dans une ligne

Au moment où j'ai

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

Je voudrais faire quelque chose comme ceci:

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

mais bien sûr quand strchr retourne null Je vais essayer de déréférencer un null aiguille.

Je sais que l'utilisation de strchr est une triche, car elle contient plus de code, mais j'aimerais voir s'il y a une façon de faire une seule ligne en utilisant simplement les fonctions c standard.


Edit: Avec un peu d'aide, c'est le meilleur que je suis venu avec:

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

Si le fichier est grand, alors il sera très lent pour le faire, ' strchr' scanne le fichier, il faudra donc du temps pour scanner le fichier encore et encore au lieu de le scanner une fois. – Guy

+0

C'est vrai, mais rappelez-vous que mon but est d'être concis, pas de vitesse. – Miguel

+1

Vous voulez quelque chose comme: char * newline_index; while ((newline_index = * strchr (texte_texte, '\ n')) && (newline_index!= NULL) && (newline_index = '')); ?? –

Répondre

3

Je suggère le code suivant. Le code suivant est en une ligne et d'éviter l'appel de la fonction strchr():

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

Vous pouvez également utiliser la boucle for:

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

Pour la solution que vous fournissez:

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

Appeler strchr() de cette façon fera le s earch commence par le début de votre file_text chaque fois que vous voulez rechercher le '\n'.

Je vous conseille de changer pour:

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

cela permettra de strchr() de poursuivre la recherche de la '\n' de la dernière position et non depuis le début.

Et même avec cette optimisation, l'appel de la fonction strchr() prend également du temps. Voilà pourquoi j'ai proposé une solution sans appeler la fonction strchr()

+0

+1, la première suggestion est plus rapide lorsque les lignes sont courtes (et sur ma machine, qui a non optimisé 'strchr') – nneonneo

+0

+1 Excellente suggestion sur l'optimisation de ce que j'avais, mais surtout j'aime cette réponse parce que vous avez réussi à le faire sans appels de fonction – Miguel

3

est ici d'une manière assez simple et efficace de le faire:

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

une bonne suggestion +1 – MOHAMED

+0

Notez que déclarer 'p' dans la boucle' for' n'est pas portable pour tout gcc – MOHAMED

+0

@MOHAMED: Il est légal C99, et devrait être accepté par tout compilateur récent sauf MSVC – nneonneo

Questions connexes