Nano Hash - криптовалюты, майнинг, программирование

Как вызывать переменные для указания формата printf в программировании на C

Я хочу использовать переменные для указания формата printf в программировании на C.

Я довольно новичок в программировании на C, хотя и практиковал сценарии оболочки bash.

В сценариях bash я могу использовать переменную для указания формата printf, как показано ниже.

#!/bin/bash

### Variable
format="%4s%4d %8s\n"

### Main
printf "$format" $1 $2 $3

Затем, есть ли аналогичный способ, подобный приведенному выше, в программировании на C?

Возможно ли это в Си?

Строки для формата printf включают символы и цифры.

Я слышал, что программирование на C использует разные объявления для каждого из них; то есть int или char.

12.08.2020

  • Вы даже можете printf использовать строку формата, которую вы используете в другом printf. 12.08.2020
  • Да, можно, но это редко бывает полезно. 12.08.2020
  • Всем спасибо! Хотя я понял, что есть много способов, значение каждой строки в коде на данный момент трудно понять, потому что сегодня все еще второе начало обучения программированию на C. Я выберу лучший ответ, когда смогу понять примеры строк. Я ценю всю поддержку со стороны сообщества. 13.08.2020

Ответы:


1

Есть ли подобный способ [format="%4s%4d %8s\n"] выше в программировании на C?
Возможно ли это в C?

Да, на оба вопроса есть несколько способов.
Среди них вы можете использовать sprintf() для подготовки буфера:

char format[80] = {0};//create editable char array
int a = 12;
char buf1[] = {"this is string 1"};
char buf2[] = {"this is string 2"};

sprintf(format, "%s", "%4s%4d %8s\n");
printf(format, buf1, val, buf2);

Еще ближе к тому, что вы сделали в своем примере ( format="%4s%4d %8s\n" ), вы можете просто определить format как строковый литерал:

char *format = "%4s%4d %8s\n";//string literal not editable

Или создайте инициализированный, но редактируемый массив символов

char format[] = {"%4s%4d %8s\n"};//editable, but only up to 
                                 //strlen("%4s%4d %8s\n"); 
                                 //(+ NULL, which is implied when using "...".)

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

double val = 22.123445677890;
int precision = 3;

printf("%.*f", precision ,  val);

Выведет 22.123

12.08.2020
  • Спасибо за ваш полезный совет. Могу я задать один дополнительный вопрос? В качестве своего собственного сообщения для ответа я использовал двойные кавычки, такие как char format[] = %s\n; . Тогда ваш пример кода использует {} как char format[80] = {0};. Имеют ли фигурные скобки {} особое значение? Следует ли их использовать в таком случае? Поскольку я новичок, я хотел бы знать, чем они отличаются. 13.08.2020
  • @CaptainCookie — да, {0} — это C способ убедиться, что все элементы array обнулены при использовании в качестве инициализатора. Существует большое обсуждение здесь об инициализации в целом, включая эту. 13.08.2020
  • Я проверю предложенную страницу! Сегодня я смог понять разницу одинарных и двойных кавычек в другом вопросе. Я также хочу понять о {}. Благодарю вас! 14.08.2020

  • 2

    Да, вы можете создать строку формата динамически:

    char fmt[20];
    int b;
    char a[SOME_SIZE];
    char c[SOME_SIZE];
    
    ...
    sprintf( fmt, "%%4s%%4d %%8s\n" ); // need %% to print a literal %, so fmt will contain "%4s%4d %8s\n"
    printf( fmt, a, b, c );
    

    Существуют и другие способы динамического построения строки формата, это самый простой.

    Я слышал, что программирование на C использует разные объявления для каждого из них; то есть int или char.

    Да, каждый спецификатор формата ожидает, что его соответствующий аргумент будет иметь правильный тип. %d ожидает, что соответствующий аргумент будет иметь тип int, %s ожидает, что его аргумент будет иметь тип char * и т. д. Если они не совпадают, то поведение будет неопределенным, и вы, скорее всего, получите странный вывод. .

    12.08.2020

    3

    Я смог достичь своей первой цели благодаря всей вашей поддержке.

    Я написал такой код ниже, используя символическую константу или char anyname[] = string.

    #include <stdio.h>
    
    #define FORMAT "%30s\n" 
    
    int main()
    {
        char c_string[] = "You Suceed!";
    
        printf(FORMAT, c_string);
    
        return 0;
    }
    
    /*
    int main()
    {
        char format[] = "%s\n"; 
        char c_string[] = "You Suceed!";
    
        printf(format, c_string);
    
        return 0;
    }
    */
    

    Я ценю все ваши предложения!

    13.08.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..