通过我在网上找到的一些编程访谈挑战,我不得不编写一个算法来反转一个const char*并返回一个指向新char*的指针.我想我已经拥有它,但是为了让它正常工作,我不得不做一些不稳定的事情 - 基本上我必须自己考虑一个空终止的角色.不知怎的,我觉得这是错的,但我很难过,我想知道是否有人可以帮助我:
char * reverse(const char * str)
{
int length = strlen(str);
char * reversed_string = new char[length+1];
for(int i = 0; i < length; ++i)
{
reversed_string[i] = str[(length-1) - i];
}
//need to null terminate the string
reversed_string[length] = '\0';
return reversed_string;
}
int main(int argc, char * argv[])
{
char * rev_str = reverse("Testing");
cout << "Your string reversed is this: " << rev_str << endl;
delete rev_str;
rev_str = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想使用指针来反转C++中的char数组.我想知道是否有什么我应该采取不同的做法?我这样做了吗?有没有更有效的方法来实现这一目标?
我的小程序:
int main ( )
{
char buffer[80];
PrintHeader();
cout << "\nString reversal program";
cout << "\nType in a short string of words.";
cout << "\nI will reverse them.";
cout << "\n:";
cin.getline(buffer, 79);
cout << "\nYou typed " << buffer;
reverse (buffer);
cout << "\nReversed: " << buffer;
cout << endl;
system("PAUSE");
return 0;
}
void reverse(char* string)
{
char* pStart, *pEnd;
int length;
char temp;
length = strlen(string);
pStart = string;
pEnd = &string[length - 1];
while(pStart …Run Code Online (Sandbox Code Playgroud) 我正在使用这个SO问题作为需要反转字符串的程序的一部分.我遇到的问题是我似乎无法使功能发挥作用.这是我的代码:
int main(int argc, char *argv[]){
char *test = "Testing";
fputs(test, stdout);
fputs(reverse_string(test), stdout);
}
char* reverse_string(char *str){
char temp;
size_t len = strlen(str) - 1;
size_t i;
size_t k = len;
for(i = 0; i < (len +1)/2; i++){
temp = str[k];
str[k] = str[i];
str[i] = temp;
k--;
}
return str;
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误 conflicting types for 'reverse_string'
编辑:对于任何想知道这里的人来说,代码是有效的.请参阅@ chux的答案以获得解释.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char* reverse_string(char *str){
char temp;
size_t len = strlen(str) - 1; …Run Code Online (Sandbox Code Playgroud) 因此,正如我从Michael Burr 对此答案的评论中所学到的,C标准不支持从数组中第一个元素之后的指针进行整数减法(我想这包括任何已分配的内存).
从C99 + TC1 + TC2组合的 6.5.6节(pdf):
如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定.
我喜欢指针算法,但这从来都不是我以前所担心的.我一直认为给定:
int a[1];
int * b = a - 3;
int * c = b + 3;
Run Code Online (Sandbox Code Playgroud)
那个c == a.
因此,虽然我相信我以前做过那样的事情而且没有被咬过,但这一定是由于我曾经使用的各种编译器的善意 - 他们已经超出了标准要求的范围.使指针算术以我认为的方式工作.
所以我的问题是,这有多常见?是否有常用的编译器不能为我做那种善意?超出数组边界的正确指针算法是一个事实上的标准吗?