1

我正在尝试循环一个 char*str 使用它来找出有多少行:

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

int lines = 0;

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

我不知道该放什么???,问题是:

1.我的意思是我需要使用 strlen(str) + 1 吗?

2.当str为“test1\ntest2\ntest3\n”时,代码是否仍然计算正确的行?

顺便说一下,我正在使用 gcc,谢谢

4

6 回答 6

7

每个文字字符串\0都以空字符结尾。它描述了字符串的结尾

所以,你可以这样做

for(int i = 0 ; str[i]!='\0' ; i ++ )
于 2012-11-11T13:18:27.443 回答
3

扩展已经存在的好答案:循环遍历 C 字符串的惯用方式是

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

如果您不想将最后一个空行计为单独的行,则添加

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

while循环之后。

于 2012-11-11T13:25:56.440 回答
1

无论最后一个字符是否为换行符,以下内容都将提供相同的结果。

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

int lines = 0;

{
    bool lastWasNewline = true;
    char * p = abc;
    for (; *p; ++p) {
        if (lastWasNewline) ++lines;
        lastWasNewline = *p == '\n';
    }
}
于 2012-11-11T13:23:40.580 回答
1

获取字符串的长度并遍历所有字符。

const unsigned long length=strlen(str);
for(int i = 0 ; i < length ; i ++ )
{
     if(str[i] == '\n') {
       lines++;
   }
}
于 2012-11-11T13:19:17.717 回答
0

代替??putstrlen(abc)并确保#include <string.h>

为了更好的效率做

int length= strlen(abc);

然后使用i < length

或使用str[i]!= '\0'

于 2012-11-11T13:17:19.413 回答
0

1.我的意思是我需要使用 strlen(str) + 1 吗?

不,只使用str[i]for i < ??,这会测试是否是0终止字符串的字符

2.当abc为“test1\ntest2\ntest3\n”时,代码是否仍然计算正确的行?

不,您的代码假定输入被分成每个缓冲区一个输入行line[j]

于 2012-11-11T13:19:23.133 回答