Да кажем, че имам следното:
char* string = "Hello, how are you?";
Възможно ли е да се отпечатат само последните 5 байта от този низ? Ами само първите 5 байта? Има ли някакъв вариант на printf
, който би позволил това?
Да кажем, че имам следното:
char* string = "Hello, how are you?";
Възможно ли е да се отпечатат само последните 5 байта от този низ? Ами само първите 5 байта? Има ли някакъв вариант на printf
, който би позволил това?
Възможно ли е да се отпечатат само последните 5 байта от този низ?
Да, просто прекарайте указател към предпоследния знак. Можете да определите това чрез string + strlen(string) - 5
.
Ами само първите 5 байта?
Използвайте спецификатор на точност: %.5s
#include <stdio.h>
#include <string.h>
char* string = "Hello, how are you?";
int main() {
/* print at most the first five characters (safe to use on short strings) */
printf("(%.5s)\n", string);
/* print last five characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - 5);
int n = 3;
/* print at most first three characters (safe) */
printf("(%.*s)\n", n, string);
/* print last three characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - n);
return 0;
}
printf
ще спре при първия нулев знак.
- person Flimm; 29.04.2014
Да, последните пет байта от този низ могат да бъдат направени с:
printf ("%s\n", &(string[strlen (string) - 5]));
Първите пет могат да бъдат направени с:
printf ("%.5s\n", string);
Можете да комбинирате двете, за да получите и поднизове в низа. Думата how
може да бъде отпечатана с:
printf ("%.3s\n", &(string[strlen (string) + 7]));
Вие направете трябва да внимавате низът да е достатъчно дълъг, за да работи това. Отпечатването на последните пет знака от низ от един символ ще доведе до недефинирано поведение, тъй като индексът завършва на -4
. С други думи, проверете дължината на низа, преди да опитате това.
int x = 3; printf ("%.*s, x, "abcde")
. Що се отнася до двете числа, това всъщност не е необходимо в този случай, тъй като знаете, че имате достатъчно знаци, но все пак го правя по навик. За низовете това е ефективно минималната и максималната дължина. Ще го махна, защото е излишен тук.
- person paxdiablo; 16.10.2011
%.*s
, а не спецификатора на формат %*s
.
- person Flimm; 29.04.2014
printf
ще спре при първия нулев знак.
- person Flimm; 29.04.2014
Две решения:
Кажете, че е даден предсказуем низ със същата дължина - ще използвам дата като пример и ще поискам да разделя на ЧЧ:ММ:СС.DDDDDDD
char date[14] = "2359591234567";
[1] Четимо изпълнение:
char hh[3] = {0};
char mm[3] = {0};
char ss[3] = {0};
char dec[8] = {0};
strncpy ( hh, date, 2 );
strncpy ( mm, date+2, 2 );
strncpy ( ss, date+4, 2 );
strncpy ( dec, date+6, 7 );
printf("%s:%s:%s.%s\n", hh, mm, ss, dec);
[2] Кратка реализация:
Или:
printf("%.2s:%.2s:%.2s.%.7s\n", date, date+2, date+4, date+6);
or:
printf("%2.2s:%2.2s:%2.2s.%7.7s\n", date, date+2, date+4, date+6);
Трябва да работи.
Вместо printf - можете да използвате sprintf и да копирате в буфер. Също така бих проверил за правилната дължина, за да избегна непредвидимо поведение.
И в двата случая изходът ще бъде:
23:59:59.1234567