распечатать указатель только до желаемой длины - PullRequest
0 голосов
/ 25 октября 2011

У меня есть функция C, подобная этой.

func(uint8_t *key,uint8_t keylen) {

FILE *fk;
fk=fopen("akey","wb");
fwrite((char *)key,keylen,1,fk);

puts((char *)key); // for testing

fclose(fk);

sprintf(sstring,"... \"%s\" ... ",(char *)key);
        // ...other irrelevant stuff for here
system(sstring);


}

Я хочу, чтобы предоставляемая клавиша в качестве ввода использовалась в месте, отмеченном \"%s\" в sprintf команде

Ввод:

  Key=qwerty

Выход:

 $cat akey
 qwerty

и вывод puts((char *)key) равен -

 qwerty�    

 // include newline character as well

Предложите мне это, я пытался с этим (в соответствующей позиции в коде), но получаю segmentation fault

    char *p;
    memcpy(p,(char *)key,keylen);
    puts((char *)p);

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Вы можете использовать форму %.*s, чтобы распечатать ее:

printf("%.*s\n", (int)keylen, (char *)key);
...
sprintf(sstring,"... %.*s ... ", ... (int)keylen, (char *)key ...);

Здесь выписка из записи Википедии в printf:

Параметры форматирования ширины и точности могут быть опущены, или они могут быть фиксированным числом, встроенным в строку формата, или передаваться в качестве другого аргумента функции, когда в строке формата указывается звездочкой «*».Например, printf ("% * d", 5, 10) приведет к печати "10" общей шириной 5 символов, а printf ("%. * S", 3, "abcdef") приведет к«abc» печатается.

ПРИМЕЧАНИЕ : использование 8-битного типа (uint8_t) для представления длины ограничивает длину строки до 255 символов.Лучше использовать size_t.

1 голос
/ 25 октября 2011

sprintf ожидает строку с нулем в конце.Это может быть не так в вашем приложении.Что касается использования memcpy - вам нужно сначала выделить память.Также убедитесь, что вы проверили на наличие ошибок, например: fk != NULL

Пример выделения памяти:

char *p = malloc(keylen + 1);
// check that p != NULL here
memcpy(p,(char *)key,keylen);
p[keylen] = 0;
puts((char *)p);
free(keylen);
1 голос
/ 25 октября 2011

Вам необходимо завершить строку на ноль (добавить завершающий байт '\ 0') или использовать% ns (например, "% .5s" для qwerty. Прекращение на ноль предпочтительнее.

...