steave
steave

Reputation: 395

search for '\n in char pointer use c

I am trying to loop a char*str use this to find out how many lines:

char *str = "test1\ntest2\ntest3";

int lines = 0;

for(int i = 0 ; i < ?? ; i ++ )
{
    if(str[i] == '\n') {
        lines++;
    }
}

I am not sure what to put at the ??, the question is :

1.I mean do I need to use strlen(str) + 1 ?

2.when the str is "test1\ntest2\ntest3\n",does the code still calculate correct lines?

I am using gcc by the way,thanks

Upvotes: 1

Views: 1202

Answers (6)

user529758
user529758

Reputation:

To extend the already-existent good answers: the idiomatic way for looping through a C string is

const char *s = "abc\ndef\nghi\n";
int lines = 0;
int nonempty = 0;
while (*s) {
    nonempty = 1;
    if (*s++ == '\n') lines++;
}

If you don't want to count the last empty line as a separate line, then add

if (nonempty && s[-1] == '\n' && lines > 0) lines--;

after the while loop.

Upvotes: 3

Anirudha
Anirudha

Reputation: 32797

every literal string ends with \0 which is a null character..It depicts the end of the string

So, You can do this

for(int i = 0 ; str[i]!='\0' ; i ++ )

Upvotes: 7

JohnB
JohnB

Reputation: 13713

The following will deliver the same result regardless if the last character is a newline or not.

char *abc = "test1\ntest2\ntest3";

int lines = 0;

{
    bool lastWasNewline = true;
    char * p = abc;
    for (; *p; ++p) {
        if (lastWasNewline) ++lines;
        lastWasNewline = *p == '\n';
    }
}

Upvotes: 1

Omkant
Omkant

Reputation: 9204

in place of ?? put strlen(abc) and make sure #include <string.h>

For better efficiency do

int length= strlen(abc);

and then use i < length

Or use str[i]!= '\0'

Upvotes: 0

Jens Gustedt
Jens Gustedt

Reputation: 78923

1.I mean do I need to use strlen(str) + 1 ?

no, just use str[i] for i < ??, this tests if that is the 0 character which terminates the string

2.when the abc is "test1\ntest2\ntest3\n",does the code still calculate correct lines?

no, you code assumes that the input is broken into one input line per buffer line[j].

Upvotes: 0

Ramy Al Zuhouri
Ramy Al Zuhouri

Reputation: 21966

Take the length of the string and iterate through all characters.

const unsigned long length=strlen(str);
for(int i = 0 ; i < length ; i ++ )
{
     if(str[i] == '\n') {
       lines++;
   }
}

Upvotes: 1

Related Questions