2010-04-14 1 views
3

У меня есть простая функция, которая принимает массив символов в качестве аргумента и преобразует все символы в нижний регистр. Тем не менее, я получаю странную ошибку нарушения прав доступа. Вот код:Функция C toLowerCase не работает - Нарушение прав доступа

void toLower(char *rec) 
{ 
int i=0; 
while (rec[i]!='\0') 
{ 
    if (rec[i]>='A' && rec[i]<='Z') 
       rec[i]='a'+rec[i]-'A'; //this is where I get an error - assigning the 
             //the value to rec[i] is the problem 
    i++; 
} 
} 

Не могли бы вы рассказать мне, в чем моя ошибка? Благодаря

+1

Как вы называете 'toLower'? – kennytm

+0

Если это не домашнее задание, есть стандартная библиотечная функция C++, 'std :: tolower' в' ', которая делает именно это. –

+0

@James McNellis: Но tolower работает только на одном персонаже. –

ответ

6

В комментарии вы говорите, что вы передаете в символьной строки в функции, например:

palindrome("In girum imus nocte et consumimur igni") 

где palindrome передает свой аргумент toLower. Это не будет работать, потому что строковые литералы доступны только для чтения, и вы пытаетесь его модифицировать. Вместо этого, вы можете использовать:

char str[] = "In girum imus nocte et consumimur igni"; 
palindrome(str); 

Или вы можете palindrome скопировать свой аргумент в массив и вызвать toLower по этому вопросу.

+0

Спасибо! Решила! Однако перед попыткой char str [] = "В girum imus nocte et consumimur igni"; Я попробовал char * str = "In girum imus nocte et consumimur igni"; И это не сработало. Зачем? Какая разница? – misaizdaleka

+0

'char * str =" ... "' - это указатель, который получает адрес литерала строки только для чтения, который не может быть изменен. 'char str [] =" ... "' - массив, поэтому его можно изменить. – interjay

+0

Отлично! Спасибо вам большое за ваше время! – misaizdaleka

6

Ты слишком много работаешь :)

#include <algorithm> //For std::transform 
#include <cctype> //For std::tolower 
#include <cstring> //For std::strlen 

void toLower(char *rec) 
{ 
    std::transform(rec, rec + std::strlen(rec), rec, std::tolower); 
} 
+0

Верно, но не решит проблему здесь (вероятно, это плохой аргумент). – interjay

+0

@interjay: Да, но если он это сделает, он может устранить эту функцию как вероятную причину проблемы. Стандартные функции библиотеки не допускают ошибок. –

+0

Спасибо, но дело в том, что я хочу немного использовать свой C :) – misaizdaleka

1

Похоже, вы не прошли в допустимом буфере. Но не пишите это сами; используйте что-то вроде strlwr.

6

Вы передаете (даже косвенно) строковый литерал? Если это так, то он может быть загружен в неприступную память; вам нужно будет внести изменения в копию.

То, что ваш прототип функции принимает char *, а не const char *, предполагает, что вы, вероятно, этого не сделали, но я подумал, что я его выброшу.

+0

OK, в основной программе я делаю это: printf («% d \ n», палиндром («В girum imus nocte et consumimur igni»)); затем, palindrome (char * rec) вызывает toLower (char * rec), передавая строку, которую я передал в первую очередь. – misaizdaleka

+1

Похоже, это проблема - попытка изменить строковый литерал. –

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