#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));
}