Ошибка возврата строки - PullRequest
       1

Ошибка возврата строки

0 голосов
/ 12 октября 2011

Может кто-нибудь объяснить мне, почему я получаю ошибку «.exe столкнулся с проблемой и требует закрытия», она компилируется и работает иногда, когда я возлюсь с массивом char, но когда это работает, я иногда получаю странные символыконец строки.

    #include <iostream>
using namespace std;
char* StrReverse3(char*);
char* StrReverse3(char* str)
{
    char *p;

    int length=0,start=0,end=0;
    length=strlen(str);

    for(start=0,end=length-1;end>= 0,start<=length-1;end--,start++)
    {
        p[start]=str[end];
    }   


    return p;
}
int main()
{
  char str[100]="Saw my reflection in snow covered hills";
  StrReverse3(str);

cin.get();
return 0;
}

Ответы [ 4 ]

6 голосов
/ 12 октября 2011

Вы не инициализируете p. Это неинициализированный указатель, в который вы пишете.

Поскольку вы пишете это на C ++, а не на C, я бы предложил использовать std::string и std::reverse:

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::string str = "Saw my reflection in snow covered hills";
    std::reverse(str.begin(), str.end());
    std::cout << str;
    return 0;
}

Выход:

sllih derevoc wons ni noitcelfer ym waS

Посмотрите, как он работает в сети на ideone

3 голосов
/ 12 октября 2011

char *p; никогда не инициализируется, однако p[start] используется в качестве назначения назначения.Разве вы не получаете предупреждения компилятора от этого?Я поражен, что это даже "иногда работает".

0 голосов
/ 12 октября 2011
#include <iostream>
#include <cstring>

using namespace std;

char* StrReverse3(char* str){
    int length=0,start=0,end=0;
    length=strlen(str);

    for(start=0,end=length-1;end > start;end--,start++){
        char temp;
        temp = str[start];
        str[start]=str[end];
        str[end]=temp;
    }

    return str;
}
int main(){
  char str[100]="Saw my reflection in snow covered hills";
  cout << StrReverse3(str);
  cin.get();
  return 0;
}
0 голосов
/ 12 октября 2011

Вы обращаетесь к памяти, которая не была выделена вашей программой (p может указывать куда угодно!).Это причина проблем, с которыми вы сталкиваетесь.

Я настоятельно рекомендую вам

  • прочитать тему динамического распределения памяти по новой и удалить, чтобы понять очень важную тему
  • читать в стандартную библиотеку шаблонов, особенно std :: string.Вы не должны использовать необработанные указатели, такие как char *, всегда используйте стандартные типы, когда это возможно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...