2012-05-24 2 views
1

Я пытаюсь преобразовать строку в верхний регистр, используя код:C++ ошибки при попытке «переписывание» массив символов

int client::get_upper(char*item_in) 
{ 
    int k ; 
    char * temp_str; 
    int length = strlen(item_in); 
    temp_str = new char [length+1]; 
    for(k = 0; k < length; ++k) 
     temp_str[k] = toupper(item_in[k]); 
    temp_str[k] = '\0'; 
    for(k = 0; k < length; ++k) 
     item_in[k] = temp_str[k]; 
    return 0; 
} 

Но когда я пытаюсь сделать это я получаю нарушение прав доступа письменности местоположение XXXXXXXX от Visual Studio. Это для класса, поэтому я ограничено использованием реальных строк.

+8

Показать, как вы * звоните * эта функция. –

+4

Любая причина, по которой вы выделяете второй массив символов, а не просто писать буквы верхнего регистра в исходный массив напрямую? (Кстати, у вас утечка памяти, потому что вы никогда не делаете delete [] temp_str в конце функции) –

+1

Лорд спаси нас от учителей «С уроками»! –

ответ

0

Предполагая, что вы правильно назовете этот код, я думаю, что у вас есть ошибка «один за другим» с temp_str [k] = '\ 0';

+0

K равно kength, и он выделил длину + 1, так что это O.K – Horonchik

+0

Ну, это все еще бессмысленно, потому что он копирует все это обратно в исходный массив, это не так/неправильно /, но это странно, точно так же. – Arafangion

0

При вызове get_upper вы передали строковый литерал? Например, ваш код для звонков примерно такой:

char *mystr = "stackoverflow.com"; 
client.get_upper(mystr)? 

Это скорее всего вызовет нарушение доступа в Visual Studio.

Если это так, то вы можете изменить определение mystr к:

char mystr[] = "stackoverflow.com"; 
+0

Согласно http://msdn.microsoft.com/en-us/library/69ze775t(v=vs.80).aspx «Результат изменения строковой константы не определен». – ibic

0

Мы не можем сказать, почему вы получаете сообщение об ошибке, не видя, как функция вызывается.

Мое подозрение, что ошибка связана с вызывающим контекстом и тем, что на самом деле указывает item_in.

Замечания Джереми Фризнера на месте - у вас есть утечка, и вам не нужен промежуточный буфер, если цель заключается в том, чтобы это было разрушительным.

2

Ваш код работает при правильном использовании (самый простой способ, чтобы просто передать местный CString как это):

char test[] = "stackoverflow.com"; 
client::get_upper(test); // client interpreted as a namespace 

Теперь ваша функция полна плохих подходов, а именно избыточной копии которая остается неуправляемым (утечка памяти).

переписан немного:

int client::get_upper(char *item_in) 
{ 
    unsigned int length = strlen(item_in); 
    for(int i = 0; i < length; ++k) 
     item_in[i] = toupper(item_in[i]); 

    return 0; 
} 

Если вы хотите немного поэкспериментировать, здесь что-то для вас, просто для удовольствия:

int client::get_upper(char *item_in) 
{ 
    int length = strlen(item_in); 
    for(int i = 0; i < length; ++i) 
     if((item_in[i] >= 97 && item_in[i] <= 122)) 
      item_in[i] = (int)item_in[i] - 32; 

    return 0; 
} 

И ваша ошибка, скорее всего, исходит из того, что вы «пытаюсь вытолкнуть динамический массив символов, которые вы, вероятно, не продумали. Просто используйте локальную строку символов, простой массив с нулевым символом. Вы действительно не давали так много, чтобы продолжать, так что это всего лишь угадывающая работа. Все, что я могу сделать, это помочь вам упростить свое выражение. Поскольку возвращаемое значение ничего не делает, попробуйте применить его к чему-либо или переключиться на void.

Надеюсь, это поможет.

+0

По какой-то причине я просто предположил, что x = toupper (x) не работает, возможно, наверняка будет недостаток понимания с моей стороны относительно того, что на самом деле происходит, когда я это делаю. – Flexo1515

+0

Отлично работает сейчас, переключившись с студии на старый добрый блокнот и g ++, и это само по себе прояснило множество проблем. Я уверен, что много кода - дерьмо, но есть много, о которых мы не узнаем о языке в этом классе, кажется ... Функция просто используется для ввода пользователей и создания правильного хэш-ключа, я понял простой случай был бы проще всего. – Flexo1515

+0

И возврат int просто рекомендуется для хорошей привычки, поэтому мы можем использовать, как/где функция выходит ... Наверное? – Flexo1515

0

Сам факт, что вы не можете использовать стандартный класс строк, не означает, что вы должны написать это как монолитную функцию.

Я бы написал простую функцию, чтобы сделать преобразование на месте. Затем, если вам нужно поддерживать работу с строками только для чтения, напишите еще одну функцию, которая дублирует ввод (используя еще одну третью функцию), а затем выполняет трансформацию на месте в дубликате.

char *duplicate(char const *input); 

char *upper_str(char *input); // does in-place transformation 

char *upper_str(char const *input); // duplicates, then transforms the duplicate 
Смежные вопросы