niedziela, Listopad 21st, 2010

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!

Kategorie: ciekawostki / iPhone
Możesz śledzić komentarze do tego wpisu poprzez kanał RSS 2.0. Możesz również napisać własny komentarz, lub umieścić odnośnik do tego wpisu, na swojej stronie.

Jeden komentarz

Wrzesień 11, 2011
malik

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);


  • *

    Spam Protection by WP-SpamFree