Один лайнер, чтобы найти длину переменной - PullRequest
0 голосов
/ 21 октября 2011

Я только что натолкнулся на мысль, что поскольку printf возвращает символы no.of, которые он напечатал в выходном потоке, почему бы не использовать его, чтобы найти длину любой переменной в c?

Код выглядит примерно так:

#include<stdio.h>
int main()
{
 char *a="Length";
 int i=1000;
 printf("Size: %d\n",printf("%d\n",i)-1);
 printf("String Size: %d",printf("%s\n",a)-1);
 return 1;
}

Я прав? Меня не волнует, где это используется. просто хотел узнать, правильно ли я понимаю.

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Что вы подразумеваете под "длиной любой переменной"? Вы имеете в виду количество байтов, используемых для хранения переменной (что лучше достигается с помощью функций sizeof и strlen), или длину в байтах строкового представления переменных?

Что касается последнего, вам следует быть осторожным, поскольку вы можете использовать параметры формата для фактического изменения результатов. Рассмотрим следующий пример:

float num = 10.0f;
printf("%.10f", num); // return value should be 13
printf("%f", num);    // return value depends on the implementation of printf and the float value supplied

Также вы должны учитывать, что существуют другие представления, кроме десятичного.

Как уже говорили другие, у printf есть побочный эффект, который он фактически записывает в stdout. Если вы не хотите этого, вы можете использовать snprintf для записи в буфер, а не в stdout:

char buffer[256];
int x = 10;
snprintf(buffer, sizeof(buffer), "%d", x); // return value is '2'
0 голосов
/ 02 марта 2014

«Один вкладыш для определения длины переменной»

Невозможно, если он не встроен в ваш компилятор, или вы не определили макрокоманду и волосатый макрос длиной в полстраницы с несколькими enums для указания вашего типа...

Для строк (которые вы не можете использовать sizeof на ...) см .: https://stackoverflow.com/a/22128415/3370790

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...