我正在通过书籍练习生成一些随机序列号,这是我的功能:
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
和A
包裹了双引号,示例输出为11764ıÒ˜
。我第一次做错了什么,为什么使用单引号修复它?
答案 0 :(得分:12)
单引号和双引号之间的区别在于双引号声明了一个字符串,单引号声明了一个字符。尝试这样做,您将收到语法错误:
'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
),但它并不意味着,给你看似随机的输出。
答案 1 :(得分:3)
单引号为您提供每个字符(字符)的ASCII表示形式,您要为其添加数字。双引号为你提供了一个字符串(char *),添加一个数字确实没有多大意义。
我可能在这里错了,但我认为至少上半场是对的!
答案 2 :(得分:2)
单引号用于单个字符常量。双引号用于字符串,C字符串或NSStrings(具有'@'前缀)。当你使用双引号时,+表示指针算术。生成的指针在预期字符的位置传递,这导致未定义的行为。正确的版本对字符进行整数运算,按预期工作。
答案 3 :(得分:1)
用于模数的数字控制在单引号中指定的ASCII字符之后可以显示在最终字符串中的ASCII字符数。请查看此表:http://www.asciitable.com/,以获取有关ASCII数字的参考。
'0'+ random()%10将为您提供从'0'到'10'的字符
'A'+ random()%26会为您提供从'A'到'Z'的字符
道歉,如果这真的很明显..
我想向此添加一个问题:是否有一种使用正则表达式生成类似字符串的好方法?
答案 4 :(得分:1)
阿德里安的回答是正确的。我只是想补充说明。
“A”做三件事。 它保留2个字符的空间,A和n终结符。 它将代表这两个字符的代码放在该空间中。 它返回第一个地址。 该地址的类型为:char *
'A'只返回A的代码值, 与上面第一个存储单元中的值相同。 值的类型为char。
所以你可以看到有很大的不同。