c - Does these methods of removing '\n' left from fgets differ concerning performance? -


i'm studying c, if question seems easy 1 or newbie ones, know why.

so, i know there lot of ways remove '\n' left fgets(), discussed on here, here , here.

i'm going focus topic these 3 methods :

  • char *strchr(const char *s, int c);

    if (fgets(sentence, 11, stdin) != null) {     p = strchr(sentence, '\n');     *p = '\0'; } 
  • char *strtok(char *str, const char *delim);

    if (fgets(sentence, 11, stdin) != null)     token = strtok(sentence, "\n"); 
  • size_t strcspn(const char *s, const char *reject);

    if (fgets(sentence, 11, stdin) != null)     sentence[strcspn(sentence, "\n")] = '\0'; 

assume variables p , token declared char *p = null, *token = null;

they job but, far performance concerned, differ?

once, surfing on web (i'm sorry haven't proof of this, because forgot link) found strspn not real way if 1 interested in performance, hence question.

before posting on i've searched here without finding want know. i've tried profiling myself, both using time ./executable , this method found on so. had no luck, because results inconsistent.

can me finding out if profiled wrong or if equal?

edit : here link found strcspn not efficient.

this method written

if (fgets(sentence, 11, stdin) != null) {     p = strchr(sentence,'\n');     p = '\0';     //^^ must *p  } 

is incorrect because new line character can absent in string. in case pointer p equal null , code snippet have undefined behaviour.

you need change like

    if ( p ) *p = '\0'; 

or

    if ( ( p = strchr(sentence,'\n') ) != null ) *p = '\0'; 

it efficient enough because 1 character searched.

however drawback need additional variable point new line character.

this method

if (fgets(sentence, 11, stdin) != null)     token = strtok(sentence, "\n"); 

semantically not suitable. function strtok used in other context when need split string tokens. , function returns null pointer in case if string contains new line character.

so appropriate method this

if (fgets(sentence, 11, stdin) != null)     sentence[strcspn(sentence, "\n")] = 0; 

because safe , no additional variable required.

as me in c++, use

if ( char *p = strchr( sentence, '\n' ) ) *p = '\0'; 

and in c, use :)

sentence[strcspn(sentence, "\n")] = '\0'; 

Comments