我正在处理Cracking the Coding Interview的一个问题。问题是:编写代码来反转C风格的字符串。 以下是我用c ++编写的答案,但我不理解增加char指针的含义。
void swap(char &a, char &b){
a = a^b;
b = a^b;
a = a^b;
}
void reverse1(char *s){
if(!s) return;
char *p = s, *q = s;
while(*q) ++q;
--q;
while(p < q)
swap(*p++, *q--);
}
我不理解的部分是第一个while循环中的第二个函数。条件*p
是什么?为什么增量q
会切断字符串中的起始字符?
例如,如果
char s[] = "1234567890";
将s
传递给函数reverse1
后,为什么++q
会为您提供"234567890"
的结果?
答案 0 :(得分:1)
p
和q
是char
的指针,两者都被初始化为char
中第一个string s[]
的地址(作为C
中的数组是指向其第一个元素的指针。 while (*q) q++;
q
增加char
(NULL
的位置),直到它到达字符串的末尾('\0'
字符--q
)。并且NULL
将位置减少到reverse1()
字符之前的一个字符,这是字符串的最后一个元素(字符)。
这就是为什么在将字符串传递给++q
并执行arr.reject{|h| h[:id].nil?}
=> [{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!107", :name=>"Folder 11", :type=>"folder"},
{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!105", :name=>"Pictures", :type=>"album"},
{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!113", :name=>"Public", :type=>"folder"},
{:id=>"folder.cecb8eb83d90dbeb.CECB8EB83D90DBEB!124", :name=>"sasd", :type=>"folder"}]
之后,结果将从第二个字符开始,而不是从第一个字符开始。
答案 1 :(得分:1)
字符串是数组。 q指向字符串的第一个字符。所以当你增加q。 q将指向下一个字符。
答案 2 :(得分:0)
C样式字符串为空(0x00或/ 0)终止。
char s[] = "1234567890";
将像这样存储在内存中:
0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x30 0x00
第一个while循环正在搜索字符串的结尾。
在while循环开始时q
指向0x31
。
在每次迭代中,q递增以指向下一个存储位置。
当q
指向0x00
循环中断时。
答案 3 :(得分:-1)
这就是'\0'
终止字符串的问题。
结果是:
0987654321
从一个名为reverse(在Visual Studio 2013
)