Длина строки с \ 0 в ней в C - PullRequest
0 голосов
/ 17 марта 2019

Хорошо, я читаю ввод от пользователя как:

scanf("%[^\n]", message); 

И теперь я инициализирую символьное сообщение [100] ="";, теперь в другой функции мне нужно узнать длину ввода в сообщении, я легко это сделал с помощью strlen(), к сожалению, он не работает должным образом, когда я делаю позже в терминале

echo -e "he\0llo" | .asciiart 50 

Он будет читать весь ввод, НО strlen вернет только длину 2.

Есть лиДругой способ узнать длину ввода?

1 Ответ

0 голосов
/ 17 марта 2019

По определению strlen останавливается на нулевом символе

вы должны считать / читать до EOF и / или новой строки, а не считать до нулевого символа после чтения строки

Как сказано в примечании %n позволяет получить количество прочитанных символов, например:

#include <stdio.h>

int main()
{
  char message[100] = { 0 };
  int n;

  if (scanf("%99[^\n]%n", message, &n) == 1)
    printf("%d\n", n);
  else
    puts("empty line or EOF");
}

Компиляции и исполнения:

pi@raspberrypi:/tmp $ gcc -g c.c
pi@raspberrypi:/tmp $ echo "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
empty line or EOF
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $ 

Как вы можетевижу, что невозможно различить пустую строку и EOF (даже глядя на errno )

Вы также можете использовать ssize_t getline(char **lineptr, size_t *n, FILE *stream);:

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

int main()
{
  char *lineptr = NULL;
  size_t n = 0;
  ssize_t sz = getline(&lineptr, &n, stdin);

  printf("%zd\n", sz);

  free(lineptr);
}

, но возможноперевод строки рассчитывается и учитывается в этом случае:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -g c.c
pi@raspberrypi:/tmp $ echo -e "he\0llo" | ./a.out
7
pi@raspberrypi:/tmp $ echo -e -n "he\0llo" | ./a.out
6
pi@raspberrypi:/tmp $ echo "" | ./a.out
1
pi@raspberrypi:/tmp $ echo -n "" | ./a.out
-1
...