Почему strlen возвращает разные значения, когда строка передается напрямую и когда строка читается? - PullRequest
0 голосов
/ 07 октября 2019

Когда я непосредственно набираю строку, например:

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

int main()
{
    char phrase[100] = "lonesomestreet";
    char phrase2[100] = "lonesomestreet";
    printf("String 1 has %d characters, and string 2 has %d characters.\n", strlen(phrase), strlen(phrase2));
    system("pause");
    return 0;

}

Возвращает 14 символов для обоих. Но если я читаю их:

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

int main()
{
    char phrase[100];
    char phrase2[100];
    printf("Type a phrase:\n");
    fgets(phrase,100,stdin);
    printf("Type a phrase:\n");
    fgets(phrase2,100,stdin);
    printf("String 1 has %d characters, and string 2 has %d characters.\n", strlen(phrase), strlen(phrase2));
    system("pause");
    return 0;

}

Возвращает 15 символов для обоих. Может кто-нибудь объяснить мне, почему это происходит?

Дополнение. Если я посчитаю символы, это также даст 15:

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

int main()
{
    char phrase[100];
    char phrase2[100];
    printf("Type a phrase:\n");
    fgets(phrase,100,stdin);
    printf("Type a phrase:\n");
    fgets(phrase2,100,stdin);
    int k=0;
    for (int i=0; phrase[i]!='\0'; i++) {
        k++;
    }
    printf("The phrase has %d characters.\n", k);
    system("pause");
    return 0;

1 Ответ

1 голос
/ 07 октября 2019

Стандартная функция fgets может добавить символ новой строки, если в массиве символов назначения достаточно места. Вы должны удалить это. Например,

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

//...

fgets(phrase,100,stdin);

phrase[ strcspn( phrase, "\n" ) ] = '\0';

Или вы можете переписать цикл for следующим образом:

size_t i = 0;
while ( phrase[i] !='\0' && phrase[i] != '\n' ) ++i;
printf("The phrase has %zu characters.\n", i);

Обратите внимание, что при попытке использовать спецификатор преобразования %zu вместо %dвывести значение, возвращаемое стандартной функцией C strlen, поскольку возвращаемое значение имеет тип size_t

printf("String 1 has %zu characters, and string 2 has %zu characters.\n", strlen(phrase), strlen(phrase2));
...