Ввод строки и копирование ее значения во вторую строку дает неправильные результаты в c

#c #string

#c #строка

Вопрос:

В этой программе я пытаюсь прочитать строку str из стандартного ввода stdin с помощью функции fgets, скопировать ее в другую вызываемую строку copy , а затем отобразить скопированную строку и ее размер.

 int main(){
  char str[10];
  char copy[10];

  printf("length of str: %ld n" ,strlen(str));
  puts("enter characters:");
    
  fgets(str,strlen(str), stdin);
  strcpy(copy,str);
  
  printf("the copy string: ");
  puts(copy);
  printf("after copy: the size - %zu n",strlen(copy));
}
  

Но когда я запускаю его, например, с тестовой строкой randomString , я получаю

 length of str: 2 
enter characters:
randomString
the copy string: r
after copy: the size - 1 
  

Я не понимаю, почему в начале он показывает длину исходной строки str как 2 или почему только первый символ введенной строки копируется во вторую строку.Какие изменения следует внести в программу, чтобы она успешно скопировала введенную строку в string copy ?

Комментарии:

1. strlen работает со строками. Как вы думаете, какая «строка» существует str в этом первом printf , учитывая str , что содержимое не было инициализировано? Используется sizeof для получения размера массива.

Ответ №1:

Проблема возникает из-за того, что str ti не инициализируется, если вы сначала пытаетесь его использовать. strlen() подсчитывает все символы, присутствующие в массиве до завершения null. В вашем примере str явно содержит пару случайных символов, за которыми следует a 0 .

С другой стороны, fgets() принимает в качестве аргумента номер считываемого символа, включая нулевой символ в конце строки. Это означает, что, если ваш str содержит два случайных символа перед нулевым символом, strlen() верните 2, и вы fgets() сможете прочитать только 1 символ всего.

Чтобы исправить это, просто измените strlen() на sizeof() , чтобы получить размер массива, содержащего вашу строку, вместо длины строки внутри (содержимое которой вы не знаете на этом этапе).

 int main(){
    char str[10];
    char copy[10];

    printf("length of str: %ld n", sizeof(str));
    puts("enter characters:");

    fgets(str, sizeof(str), stdin);
    strcpy(copy,str);

    printf("the copy string: ");
    puts(copy);
    printf("after copy: the size - %zu n",strlen(copy));
}