Kategorie
ciekawostki iPhone

iPhone: Jak wprowadzić % (procent) w NSString

Jak zrobić znak procenta w NSString? Wprowadzenie samego % spowoduje, że NSString spróbuje go przetworzyć, ale będzie oczekiwał jakiegoś znaku „po”, który pozwoli mu określić typ. Ponieważ żadnego nie znajdzie, nie wyświetli żadnego znaku w danym miejscu. Specjalnie do tego zadania przygotowano zatem znak %%, który rozwiązuje problem.

Be Sociable, Share!

W odpowiedzi na “iPhone: Jak wprowadzić % (procent) w NSString”

to jest printf format

wielu nowicjuszy sie glowi nad tym procentem bo przeaczaja ten fragment w ksiazce do C. znak procenta – % – jest znakiem kontrolnym w format string. dla kazdego znaku procenta znalezionego w format string pobierany jest ze stosu bedacy dlugosci integera argument. za kazdym znalezionym znakiem procenta znajduje sie terminowany spacja ciag znakow okreslajacy sposob interpretacji danego argumentu pobieranego.

w format string podwojny procent („%%”) zamieniany jest na pojedynczy znak procenta w trakcie dzialania funkcji printf. Podobnie w ciagach C (przeksztalcanych na poziomie kompilatora) znak backslash (\) jest znakiem kontrolnym pozwalajacym na wstawienie dowolnego znaku z zestawu ASCII. Sekwencja umozliwiajaca wstawienie backslasha jest taka sama – „\\”.

Dla printf format wyglada tak: %[parameter][flags][width][.precision][length]type
Najwazniejszym i jedynym obowiazkowym parametrem jest ‚type’

d, i Print an int as a signed decimal number. ‚%d’ and ‚%i’ are synonymous for output, but are different when used with scanf() for input.
u Print decimal unsigned int.
f, F Print a double in normal (fixed-point) notation. ‚f’ and ‚F’ only differs in how the strings for an infinite number or NaN are printed (‚inf’, ‚infinity’ and ‚nan’ for ‚f’, ‚INF’, ‚INFINITY’ and ‚NAN’ for ‚F’).
e, E Print a double value in standard form ([-]d.ddd e[+/-]ddd). An E conversion uses the letter E (rather than e) to introduce the exponent. The exponent always contains at least two digits; if the value is zero, the exponent is 00. In Windows, the exponent contains three digits by default, e.g. 1.5e002, but this can be altered by Microsoft-specific _set_output_format function.
g, G Print a double in either normal or exponential notation, whichever is more appropriate for its magnitude. ‚g’ uses lower-case letters, ‚G’ uses upper-case letters. This type differs slightly from fixed-point notation in that insignificant zeroes to the right of the decimal point are not included. Also, the decimal point is not included on whole numbers.
x, X Print an unsigned int as a hexadecimal number. ‚x’ uses lower-case letters and ‚X’ uses upper-case.
o Print an unsigned int in octal.
s Print a character string.
c Print a char (character).
p Print a void * (pointer to void) in an implementation-defined format.
n Print nothing, but write number of characters successfully written so far into an integer pointer parameter.
% Print a literal ‚%’ character (this type doesn’t accept any flags, width, precision or length).

trzeba miec sie troche na bacznosci poslugujac sie printf’em bo jest to mechanizm ktorym nowicjusz moze postrzelic sie w stope. 😉 przekazanie niesanityzowanych danych od uzytkownika jako format string otwiera podatnosc na atak.

typowym bledem jest:
printf(ciag_od_uzytkownika);

prawidlowe skladnie to:
printf(„%s”, ciag_od_uzytkownika);
lub
puts(ciag_od_uzytkownika);

Możliwość komentowania jest wyłączona.