В чем разница между одинарными и двойными кавычками в Objective-C? - PullRequest
2 голосов
/ 06 июня 2010

Я работаю над книжным упражнением, чтобы сгенерировать случайный серийный номер, и вот моя функция:

NSString *randomSerialNumber = [NSString stringWithFormat:@"%c%c%c%c%c",
                                    '0' + random() % 10,
                                    'A' + random() % 26,
                                    '0' + random() % 10,
                                    'A' + random() % 26,
                                    '0' + random() % 10];

Это работает и имеет следующий вывод: 2J6X7. Но до этого 0 s и A s, которые я заключил в двойные кавычки, и пример вывода был 11764ıÒ˜. Что я сделал неправильно в первый раз, и почему с помощью одинарных кавычек это исправить?

Ответы [ 5 ]

12 голосов
/ 06 июня 2010

Разница между одинарными и двойными кавычками заключается в том, что двойные кавычки объявляют строку, а одинарные кавычки объявляют один символ. Попробуйте сделать это, вы получите синтаксическую ошибку:

'More than one character'

Причина, по которой ваш код вывел несколько случайных символов, состоит в том, что строки не являются целыми числами, как большинство других типов данных, а являются указателями. Это означает, что при вводе "A string" результатом выражения является область памяти, в которой хранятся символы. Это может быть где угодно в памяти, в зависимости от того, когда вы запускаете программу. Итак, когда вы добавили random() в строку, он дал вам случайный адрес памяти! Заявление было эквивалентно этому на английском языке:

Store the characters "A" in memory, and then give me the memory
address a random amount of cells later.

Случайное количество ячеек позже может быть любым другим в вашей программе. Указатель был интерпретирован как символ (из-за %c), но это не было предназначено, давая вам, казалось бы, случайный вывод.

3 голосов
/ 06 июня 2010

Одинарные кавычки дают вам представление ASCII каждого символа (символа), к которому вы добавляете число. Двойные кавычки дают вам строку (char *), к которой добавление числа не имеет особого смысла.

Я могу ошибаться, но я думаю, что по крайней мере первая половина права!

2 голосов
/ 06 июня 2010

Одинарные кавычки используются для односимвольных констант. Двойные кавычки используются для строк, либо строк C, либо строк NSS (которые имеют префиксы @). Когда вы используете двойные кавычки, + означает арифметику указателя. Полученные указатели были переданы там, где ожидались символы, что приводит к неопределенному поведению. Правильная версия выполняет целочисленную арифметику для символов, которая работает, как и ожидалось.

1 голос
/ 07 июня 2010

Адриан ответ правильный. Я просто пытаюсь добавить пояснения.

«А» делает три вещи. Он резервирует место для 2 символов, A и нулевого терминатора. Он помещает коды, которые представляют эти два символа в этом пространстве. Возвращает адрес первого. Этот адрес имеет тип: char *

«A» просто возвращает значение кода для A, то же значение, которое было указано в первой ячейке памяти выше. значение имеет тип char.

Итак, как вы можете видеть, есть большая разница.

1 голос
/ 06 июня 2010

Числа, которые вы используете для модуля, определяют количество символов ASCII после того, которое указано в одинарных кавычках, которые могут отображаться в последней строке. Взгляните на эту таблицу: http://www.asciitable.com/, для ссылки на номера ASCII.

'0' + random ()% 10 даст вам символы от '0' до '10'

'A' + random ()% 26 даст вам символы от 'A' до 'Z'

Извинения, если это действительно очевидно ..

Я хотел бы добавить к этому вопрос: есть ли хороший способ создать похожую строку, используя вместо этого регулярные выражения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...