2016-01-19 5 views
3

У меня проблема с доступом к памяти. Когда i = 0, Visual Studio выдает исключение со ссылкой на строку, помеченную в следующем коде.Swap 2 char из массива C++

не удается получить доступ в 0x00AD8B3B и 0x00AD8B3B равен scr+np-i

Как я могу исправить тело для цикла, с тем, чтобы устранить эту проблему?

int o_strrev(char* scr) 
{ 
    int np = strlen(scr) - 1; 
    char tmp; 

    if (!scr) return -1; 
    if (!*scr) return -1; 

    for (int i = 0; i < np/2; i++) 
    { 
    tmp = scr[np-i]; 
    scr[np-i] = scr[i]; # this line 
    scr[i] = tmp; 
    } 

    return 0; 
} 
+4

Как вы называете эту функцию? Что вы передаете как параметр? –

+10

Успокойтесь, чтобы передать эту константу в строку, такую ​​как строковый литерал. –

+5

И проверить (! Scr) до того, как будет вызываться stlen (scr) ... – prabindh

ответ

2

Как отметил @Revolver_Ocelot, вы вероятно, передавая const char* из строкового литерала. Поскольку они по определению постоянны, вы не можете изменять их так, как вы пытаетесь. Вам нужно каким-то образом преобразовать const char* в константу char*. Что-то вдоль этих линий будет работать для вас:

string str = "string"; 
char* cstr = new char[str.length() + 1]; 
strcpy(cstr, str.c_str()); 

Я составил свой код в г ++ с использованием не постоянное char* и она отлично работает. Просто не забудьте освободить свой char*, когда закончите с ним. Мы не хотим утечки памяти;)

1

Я вижу, что вы пытаетесь изменить строку. Я мог бы предложить более простой способ

void reverse(char *string_var) 
{ 
    int length, c; 
    char *begin, *end, temp; 

    length = strlen(string_var); 
    begin = string_var; 
    end = string_var; 

    for (c = 0; c < length - 1; c++) 
     end++; 

    for (c = 0; c < length/2; c++) 
    {   
     temp = *end; 
     *end = *begin; 
     *begin = temp; 

     begin++; 
     end--; 
    } 
} 

Убедитесь, что вы передаете массив символов формы

char word[64] 

Или, может быть, с помощью рекурсии

void reverse(char *x, int begin, int end) 
{ 
    char c; 

    if (begin >= end) 
     return; 

    c = *(x+begin); 
    *(x+begin) = *(x+end); 
    *(x+end) = c; 

    reverse(x, ++begin, --end); 
} 
1

Вы, скорее всего, вызывая o_strrev с строкового литерала, некоторые вещи, как:

o_strrev("This ain't gonna work!"); 

будет скомпилирован с большинством компиляторов и в большинстве генерировать предупреждение. Попробуйте поднять уровень предупреждений.

Вместо этого, вы хотите, чтобы сделать динамическую копию строки в куче и работать с char* указателем на что, что-то вроде:

string str = "This is gonna work!!" 
size_t len = str.size(); 
char* my_string = new char[len + 1]; 
strncpy(my_string, str.data(), len) 
my_string[len] = '\0'; 

o_strrev(my_string); 

// ... 

delete[] my_string; 
+0

@TobiMcNamobi Отредактированный ответ будет одним :) –

+0

Большое спасибо! – TobiMcNamobi

Смежные вопросы