Я знаю, что для получения размера можно использовать функцию 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 ..>.> ..

c
2
Belphegor 5 Окт 2014 в 08:13
К сожалению, массивы C — это всего лишь низкоуровневые блоки памяти. Программист несет ответственность за отслеживание (используя отдельную переменную) того, сколько элементов хранится в массиве и в каких позициях массива они хранятся.
 – 
hugomg
5 Окт 2014 в 08:17
Как насчет функции, которая ищет в массиве символ новой строки?
 – 
Beta
5 Окт 2014 в 08:17
1
Этот вопрос может показаться вам информативным: "sizeof-vs-strlen"
 – 
WhozCraig
5 Окт 2014 в 08:19
Единственный способ, которым я знаю, как проходить массив (поиск), - это цикл for, и это означало бы, что мне нужно знать, что такое n (длина). Я знаю, что есть другие способы, но я все еще нуб в этом.
 – 
Belphegor
5 Окт 2014 в 08:20
1
 – 
iqstatic
5 Окт 2014 в 08:20

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;
}
0
ani627 6 Окт 2014 в 15:58
Подожди, ты серьезно :D? Я предполагал, что нам нужен какой-то реальный алгоритм кода. Таким образом, это будет ТОЛЬКО подсчитывать количество элементов, хранящихся внутри, включая пространство?
 – 
Belphegor
5 Окт 2014 в 08:16
2
Вероятно, следует проверить '\n' перед его удалением и не использовать strlen дважды.
 – 
user3125367
5 Окт 2014 в 09:01
1
strlen(array) - 1 в основном находится в состоянии катастрофы. Лучше всего использовать подход strchr(). Также обратите внимание, что fgets() ни в коем случае не добавляет \n. @user3718584
 – 
alk
5 Окт 2014 в 12:10
1
strlen() возвращает size_t, а не int, то же самое для sizeof.
 – 
alk
5 Окт 2014 в 12:11
1
@1336087: 1.: strlen(array) - 1: Представьте, что произойдет, если вы передадите "" в strlen() - 1? 2.: Если fgets() встречается с EOF перед \n, он не добавляет \n.
 – 
alk
6 Окт 2014 в 14:26

В: Можно ли получить количество элементов, хранящихся в данный момент в массиве на C?

  1. Краткий ответ: Нет. Вам нужно отслеживать эту информацию самостоятельно.

  2. Вы случайно используете fgets () с массивом символов. Поскольку в этом случае вы получаете "строку" C, вы можете использовать функцию C strlen ().

  3. Стоит отметить, что fgets () также вернет новую строку, поэтому ваша строка может быть на один (Mac, Linux) или два (DOS / Windows) символа длиннее, чем вы ожидаете.

PS :

Вот еще немного о строках C, включая концепцию «нулевого завершения» (если вы еще не знакомы с ними):

http://www.cprogramming.com/tutorial/c/lesson9.html

2
Jabberwocky 6 Окт 2014 в 16:15
Да, вы правы, у него есть новая строка, и когда я печатаю, он дает мне эти 2 пробела. Я предполагаю, что смогу просто удалить эту новую строку позже.
 – 
Belphegor
5 Окт 2014 в 08:21
Спасибо за помощь и ссылку!
 – 
Belphegor
5 Окт 2014 в 08:31
1
Объявление 3) fgets чаще всего используется для чтения из текстовых потоков (например, stdin), поэтому символ новой строки (каким бы он ни был в какой-то системе) преобразуется в '\n'.
 – 
mafso
5 Окт 2014 в 08:46