Как установить количество выводимых символов в формате fprintf '%s' с помощью переменной?

Мне нужно записать в файл переменное количество символов. Например, допустим, я хочу напечатать 3 символа. «TO» напечатает «TO» в файл. «Длинная строка символов» напечатает «Lon» в файл.

Как я могу это сделать? (количество символов определяется в другой переменной). Я знаю, что это возможно fprintf(file,"%10s",string), но 10 предопределено


person Señor Reginold Francis    schedule 23.09.2009    source источник


Ответы (4)


Это соответствует вашему примеру:

fprintf(file, "%*s", 10, string);

но вы также упомянули максимум, чтобы также ограничить число:

fprintf(file, "%*.*s", 10, 10, string);
person DigitalRoss    schedule 23.09.2009

Я считаю, что вам нужно «% * s», и вам нужно будет передать длину как целое число перед строкой.

person Stephen Nutt    schedule 23.09.2009
comment
Это напечатает минимум столько символов и не будет ограничивать количество печатаемых символов. - person Chris Lutz; 24.09.2009

В качестве альтернативы, почему бы не попробовать это:

void print_limit(char *string, size_t num)
{
  char c = string[num];
  string[num] = 0;
  fputs(string, file);
  string[num] = c;
}

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

person Chris Lutz    schedule 24.09.2009
comment
Если вы сделаете это... убедитесь, что длина string не меньше num-1, иначе вы будете временно перезаписывать какой-то случайный байт памяти!! - person We Are All Monica; 24.09.2009
comment
Это верно. Пусть это будет уроком никогда не доверять наспех/лениво написанному коду, который вы получаете из интернета. - person Chris Lutz; 24.09.2009

В качестве альтернативы вы можете создать «c_str» из своего буфера и подготовить строку для печати, как я делаю это в этом источнике:

void print(char *val, size_t size) {
    char *p = (char *)malloc(size+1); // +1 to zero char
    char current;
    for (int i=0; i < size; ++i) {
        current = val[i];
        if (current != '\0') {
           p[i] = current; 
        } else {
           p[i] = '.'; // keep in mind that \0 was replace by dot
        }
        p[i+1] = '\0';
    }
    printf("%s", p);
    free(p);
}

Но это неправильное решение. Вы должны использовать fprintf с форматом "%*s".

person Vitold S.    schedule 01.12.2014