Как в этом случае работает strlen? - PullRequest
0 голосов
/ 08 мая 2020

См. Следующий код:

#include<stdio.h>
#include<string.h>
int main(void)
{
    printf("%lu",strlen("\\n"));
}

Я знаю, что на выходе будет 2, но не знаю, будет ли \\ первым учитываемым символом, а затем n или \ будет первым отсчетом, а \n вторым?

Ответы [ 4 ]

1 голос
/ 08 мая 2020

Из стандарта C (6.4.4.4 Символьные константы)

простая escape-последовательность: одна из

\' \" \? \\
\a \b \f \n \r \t \v

и

3 Одиночные кавычки ', двойные кавычки ", вопросительный знак?, ** backsla sh ** и произвольные целочисленные значения могут быть представлены в соответствии со следующей таблицей escape-последовательностей:

single quote ' \'
double quote " \"
question mark ? \?
backslash \ \\
octal character \octal digits
hexadecimal character \x hexadecimal digits

Таким образом, этот строковый литерал "\\n" содержит backslash и символ n.

0 голосов
/ 08 мая 2020

Попробуйте напечатать строку. Будет напечатано

#include<stdio.h>
#include<string.h>
int main(void)
{
    printf("%s","\\n");
}

\n. Это означает, что первый символ - \\ (escape-последовательность, которая преобразуется в \), а второй символ - n.

0 голосов
/ 08 мая 2020

"\\n" анализируется слева направо. "\\" - это escape-последовательность для backsla sh (одиночный \). "n" в данном случае - это просто "n", а не "\n". Следовательно, два символа return и strlen.

0 голосов
/ 08 мая 2020

" ... Но я не понимаю, будет ли \\ первым принимаемым во внимание символом, а затем n или \ будет первым отсчетом, а \n будет второй?"

"\\" - это представление символа '\' внутри строкового литерала.

Таким образом, первый символ строкового литерала "\\n" - это '\', а 'n' - второй.

Вы можете провести эксперимент, используя printf("\\n");. Результатом будет \n, а не \(line feed).

.
...