我需要将char指针传递给function,然后更改它指向函数内部的值并在函数外部打印值。
我遇到的问题是,当我离开功能并尝试在外面打印时,我会丢失它。我该怎么做才能避免这种情况?
这是一个代码示例:
char array[] = "Bada boom";
char *pText = array;
reverseText(pText);
cout << (pText);
cout应该打印
moob adaB
当我在函数内打印时,一切都很好(它反转打印)。 我的任务是在函数外部打印出来(如第4行代码所示)
这是一个有错误的代码(在func中打印,在外面没有工作)
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
char reverseText(char *text);
int main(){
char array[] = "Bada boom";
char *pTekst = array;
reverseText(pTekst);
cout << (pTekst); //in here it doesn't work
}
char reverseText(char *text){
char befRev[100]; int lenght=-1;
/*until *text doesn't meet '\0' */
for(int i=0;*text!='\0';i++){
befRev[i]=(*text);
text++;
lenght++;
}
/*reversing*/
int j=0;
for(int i=lenght;i>=0;i--){
*(text+j)=befRev[i];
j++;
}
for(int i=0;i<=lenght;i++) //in here it does print the right value
cout << text[i];
};
答案 0 :(得分:3)
只需将阵列重新安排到位。指针本身不需要改变:
#include <cstring>
#include <algorithm>
void reverseText(char* array)
{
auto len = std::strlen(array);
std::reverse(array, array+len);
}
int main()
{
char array[] = "Bada boom";
char *pText = array;
reverseText(pText);
std::cout << pText << std::endl;
}
输出:
moob adaB
如果你真的想提供一个指向调用者不同地址的指针,你可以直接返回它:
char* foo(char* stuff)
{
char* tmp = ....;
...
// do some stuff
...
return tmp;
}
或者,您可以通过引用传递指针,但意图不如以前的版本清晰:
void foo(char*& stuff)
{
stuff = something_else;
}
但在这两种情况下,你必须绝对确定新指针所指向的东西在函数之外是有效的。这可能需要一些动态内存分配。对于您的情况,似乎最好和最简单的选择是重新安排阵列。
答案 1 :(得分:1)
要回答您的问题,您的逻辑错误。请注意,在reverseText的第一个循环中,您将增加本地指针文本。在你的第二个循环中,你没有将文本重置为它的原始值,所以在从位置文本+偏移开始复制复制之前。
如果您在调用reverseText返回时查看pText,您会发现它包含: &#34; Bada boom \ 0moob adaB&#34;
你的reverseText应该重命名为palindrome:)
答案 2 :(得分:0)
这非常简单。有些要点需要注意:
以下是C中的一些易于转换为C ++的代码。制定实际的反向算法留给你作为练习。
#include<stdio.h>
void reverseText(char* text)
{
// Hint: It can be done in one loop!
int i;
for(i = 0; i < 9; i++)
{
// Your algorithm to reverse the text. I'm not doing it for you! ;)
*(text + i) = 'r';
}
}
int main()
{
char array[] = "Bada boom";
reverseText(array);
printf("The text reversed: %s\n", array);
return 0;
}
答案 3 :(得分:0)
我的最终代码:
#include <iostream>
void reverseText(char* text){
int length=-1; char tmp;
/*Length = sign from 0 to 8 without counting explicit NUL terminator*/
for(int i=0;*(text+i)!='\0';i++){
length++;
}
int j=0; int i=length;
while(j<i){
tmp=*(text+j); //tmp=first
*(text+j)=*(text+i); //first=last
*(text+i)=tmp; //last=tmp
j++;
i--;
}
}
int main(){
char array[] = "Bada boom";
char *pText = array;
reverseText(pText);
std::cout << pText;
}
在开始本练习之前,我应该阅读更多有关指针的内容。
答案 4 :(得分:-1)
您可以返回指针或将指针作为函数参数传递给指针。
//pointer to pointer
void reverseText(char** textPtr) {
char* newText = ...; //initialize;
...
*textPtr = newText; //assign newText
}
//return pointer
char* reverseText(char* text) {
char* newText = ...; //initialize
return newText;
}
请记住,如果您在此功能中分配内存,则必须动态执行此操作(使用new
或malloc
),然后您必须将其释放(使用delete
或{{1} } 分别)。像这样的函数中的内存分配可能是一种不好的做法,应该避免使用。