-3

对于文本:Hi\r\n how is it going \r\nareyouoay\r\n; 答案应该是3,新行并不 \n意味着严格\r\n,所以只是有\n不好

这是我的尝试,我做错了什么?

FILE  *fp = fopen(fileName, "r"); 
int c, lastchar;           
int lineCount= 0;
int i;

while ( (c=fgetc(fp)) != EOF ) {
    if ( c == 'r' && lastchar == '\\' && c+1== '\\' && c+2=='n')
        lineCount++;
    lastchar = c; 
    i++;
}

该文本的输出应为 3。

4

3 回答 3

1

如果你必须一次做你的搜索字符,你可以使用类似下面的代码

int c;           
int lineCount= 0;
int i = 0;
char next[] = {'\\', 'r', '\\', 'n' };
while ( (c=fgetc(fp)) != EOF ) {
    if (c != next[i]) {
        i = 0;
    }
    else {
        if (i == sizeof(next) - 1) {
            i = 0;
            lineCount++;
        }
        else {
            i++;
        }
    }
}

对于有限的输入文件大小,最好将整个文件读入内存,然后使用strstr。或者,对于较大的输入,将块读入内存,使用strstr并考虑如何避免在块边界上丢失匹配项。

于 2013-02-06T16:41:39.967 回答
0

What you're doing wrong is, \n is 1 character, not multiple characters.

Hence to count the number of lines you gotta do this:

while ((c = fgetc(fp))!= EOF){
   if(c == '\n') lineCount++;
}

printf("No. of lines = %d", lineCount);
于 2013-02-06T16:42:56.467 回答
0

字符\r\n是单个字符,因此在阅读您的输入时,您不会\\在其中找到字符。此外,如果您在 Windows 上,您应该使用 mode 打开文件以"rb"二进制模式打开它,否则运行时将删除\r字符。

FILE  *fp = fopen(fileName, "rb");
int lastchar = 0;
int lineCount = 0;
int c;

while ((c = fgetc(fp)) != EOF) {
    if (lastchar == '\r' && c == '\n')
        lineCount++;
    lastchar = c;
}

printf("line count: %d\n", lineCount);

如果你真的想计算四个字符的连续性\\ r \\ n,那么你可以这样做(看起来很奇怪,但也许你的输入中有引用的字符序列):

FILE  *fp = fopen(fileName, "rb");
char prevchars[4] = { 0, 0, 0, 0 };
char fingerprint[4] = { '\\', 'r', '\\', 'n' };
int lineCount = 0;
int c, i;

while ((c = fgetc(fp)) != EOF) {
    if (memcmp(prevchars, fingerprint, 4) == 0)
        lineCount++;
    for (i = 1; i < 4; i++)
        prevchars[i - 1] = prevchars[i];
    prevchars[3] = (char)c;
}

printf("line count: %d\n", lineCount);
于 2013-02-06T17:00:37.417 回答