\r 和 \n 的深度区别

Ibt*_*med 0 c

这是我计算给定字符串的字符数的代码(即使用strlen()函数):

#include <stdio.h>
#include <string.h>

#define N 30

int main() {
    char input[N];
    gets(input);
    int j = strlen(input);
    printf("using library fnc strlen=%d", j);
    int i = 0, sum = 0;
    for (i = 0; input[i] != '\0'; i++) {
        sum = sum + i;
    }
    printf("\rusing loop %d", sum);
}
Run Code Online (Sandbox Code Playgroud)

在Code::Blocks(gcc编译器)上,结果显示如下:

abcdef78
using loop 4y fnc strlen=8
Process returned 0 (0x0)   execution time : 5.816 s
Press any key to continue.
Run Code Online (Sandbox Code Playgroud)

但是Programiz的在线编译器显示是这样的:

/tmp/rzNX0Zm3SF.o
abcdef78
using library fnc strlen=8
using loop 8
Run Code Online (Sandbox Code Playgroud)

但是在我更改了代码之后\r\n如下所示:

#include <stdio.h>
#include <string.h>

#define N 30

int main() {
    char input[N];
    gets(input);
    int j = strlen(input);
    printf("using library fnc strlen=%d", j);
    int i = 0, sum = 0;
    for (i = 0; input[i] != '\0'; i++) {
        sum = sum + 1;
    }
    printf("\nusing loop %d", sum);
}
Run Code Online (Sandbox Code Playgroud)

代码在任何地方都可以正常工作(Code::Blocks 也是如此)这\r和怎么了\n

AKX*_*AKX 6

你的第一个代码有

for(i=0;input[i]!='\0';i++) {
   sum = sum + i;
}
Run Code Online (Sandbox Code Playgroud)

你的第二个代码有

for(i=0;input[i]!='\0';i++) {
   sum = sum + 1;
}
Run Code Online (Sandbox Code Playgroud)

即对于五个字符的字符串,第一个计算 0 + 1 + 2 + 3 + 4,而第二个计算 1 + 1 + 1 + 1 + 1。

除此之外,\r只需将光标返回到行首,同时\n前进到下一行。

IOW,打印foo\rbar只会显示bar,因为您正在打印foo,倒带到行首并用 覆盖它bar