Я знаю, что для получения размера можно использовать функцию sizeof, но она не дает точного подсчета длины массива. Если я установлю массив int 50 и сохраню в нем только 10 чисел, я бы хотел получить 10 в качестве количества элементов, но, конечно, этого не произойдет. Я знаю, что это определенно тривиальный вопрос, но терпите меня и помогите мне в этом, если это возможно.
Мой код пока занимает целое предложение и хранит его в массиве.
#include <stdio.h>
#include <string.h>
int main()
{
int i=0;
char array[50]={0};
fgets(array, 50, stdin);
int len = sizeof(array); // it doesn't work :((((((
for(i=0; i<len; i++)
{
printf("%c\n", array[i]);
}
return 0;
}
Как вы, ребята, можете видеть, если пользователь решает ввести только слово, скажем, «Бобби Фу», тогда мне нужно будет число 9, включая пробел, но функция sizeof получает только длину, равную размеру объявленного массива, который равен 50 ..>.> ..
2 ответа
Используйте strlen
, чтобы получить размер array
. Вам необходимо включить string.h
.
sizeof()
- это не функция, это оператор. Когда sizeof
применяется к имени статического массива (не выделенного через malloc
), результатом является размер всего массива в байтах.
Если вы используете fgets
, вам необходимо удалить \n
из строки. Простой способ:
array[strlen(array) - 1] = '\0';
Быстрый пример:
#include <stdio.h>
#include <string.h>
#include <stddef.h>
int main()
{
int i=0;
char array[50]={0};
char *p;
fgets(array, 50, stdin);
//Remove `\n` from the array.
if ((p=strchr(array, '\n')) != NULL)
*p = '\0';
size_t len = strlen(array); // Use strlen to find the length of string
for(i=0; i<len; i++)
{
printf("%c\n", array[i]);
}
return 0;
}
strlen(array) - 1
в основном находится в состоянии катастрофы. Лучше всего использовать подход strchr()
. Также обратите внимание, что fgets()
ни в коем случае не добавляет \n
. @user3718584
strlen()
возвращает size_t
, а не int
, то же самое для sizeof
.
strlen(array) - 1
: Представьте, что произойдет, если вы передадите ""
в strlen() - 1
? 2.: Если fgets()
встречается с EOF
перед \n
, он не добавляет \n
.
В: Можно ли получить количество элементов, хранящихся в данный момент в массиве на C?
Краткий ответ: Нет. Вам нужно отслеживать эту информацию самостоятельно.
Вы случайно используете fgets () с массивом символов. Поскольку в этом случае вы получаете "строку" C, вы можете использовать функцию C strlen ().
Стоит отметить, что fgets () также вернет новую строку, поэтому ваша строка может быть на один (Mac, Linux) или два (DOS / Windows) символа длиннее, чем вы ожидаете.
PS :
Вот еще немного о строках C, включая концепцию «нулевого завершения» (если вы еще не знакомы с ними):
http://www.cprogramming.com/tutorial/c/lesson9.html
fgets
чаще всего используется для чтения из текстовых потоков (например, stdin
), поэтому символ новой строки (каким бы он ни был в какой-то системе) преобразуется в '\n'
.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.