печать значений ascii из строки argv за один вызов printf

Я хочу напечатать значения ascii всех символов из строки, полученной от argv, используя только один вызов printf.

Что-то вроде этого, но для печати только допустимых символов ( != 0 ):

printf (" string is %s , in ascii = 0x%X %X %X %X", argv[1], 
          argv[1][0], argv[1][1], argv[1][2], argv[1][3]);

Я не хочу использовать цикл for, от 0 до strlen(argv[1]). Мне нужно использовать только один вызов печати.

Если argv[1] = "a", то я хочу печатать только: string is a , in ascii = 0x61

Если argv[1] = "ab", то я хочу печатать только: строка ab, в ascii = 0x61 62

Проблема в том, что я не хочу печатать мусорные данные


person alexsoad    schedule 16.09.2012    source источник
comment
Идя по течению ответа, если вы знаете, что argv[1] существует, и хотите, чтобы все это было в одной конструкции, char *ptr = argv[1]; for (printf("string is %s , in ascii = 0x", ptr); *ptr; printf("%X ", *ptr++));. Вы должны перефразировать часть in ascii во что-то вроде кодов символов, поскольку использование ASCII не гарантируется.   -  person chris    schedule 16.09.2012
comment
Количество символов в строке определяется во время выполнения. Вы не можете написать один оператор во время компиляции, который обрабатывает каждую строку и не содержит цикла с динамическим условием выхода.   -  person Kerrek SB    schedule 16.09.2012


Ответы (1)


Вы не можете сделать это без цикла. printf будет искать в стеке только определенную глубину и всегда будет печатать заданное количество значений. Вы не можете заставить его искать переменное количество значений, поэтому цикл — ваш лучший выбор:

char *ptr = argv[1];
while (ptr) printf("%X ", *ptr++);

(технически это цикл while, а не цикл for).

person epsalon    schedule 16.09.2012
comment
Если нужно иметь только один вызов printf() ради производительности или удобства, просто используйте sprintf() и strcat() для предварительного создания строки. - person Cloud; 16.09.2012