Ошибка записи указателя C - PullRequest
1 голос
/ 16 июля 2010
 void fileNameProcess(char * inputName){
             int size =strlen(inputName);
             bool change=false;
             char * name=inputName;

             for(int i =0; i<size; i++){
                 char temp=* (name+i);
                 if(temp<0x10||temp>0x5b){
                     change=true;
                 }else if(0x19<temp<0x21){
                     change=true;
                 }else if(0x3a<temp<0x41){
                     change=true;
                 }
                 if(change){
                     //*(name+i)='_';
                     memset(name+i, '_', 1);
                     change=false;
                 }
             }

         }

он ломается, когда я пытаюсь установить символ в строке (memeset), но я не понимаю, почему он не позволяет мне это сделать? почему я могу разрешить доступ для чтения, но не могу изменить его? может кто-нибудь объяснить это в аспекте памяти. Я думаю, это потому, что строка передается в функцию. но пока я знаю местоположение мемориала, я могу установить его правильно?

спасибо

char * filename= strdup("try1.mat");
    writter.locate(filename);

в его месте назначьте имя файла для класса memeber char * filepath

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Это:

if(1 < variable < 2)

Вероятно, не делает то, что вы хотите.Используйте:

if(1 < variable && variable < 2)

edit , если (1

if( (1 < variable) < 2)
if( (true) < 2)
//given true is often* assigned a value of 1 this will always be true and
if( (false) < 2)
//false is always zero this will also be true

* Я не думаю, что этого требуетстандарт, поэтому не надейтесь на это.

4 голосов
/ 16 июля 2010

Скорее всего, вы даете постоянную литеральную строку в качестве ввода:

char * str = "test";
fileNameProcess(str);

Если это так, попробуйте:

char * str = strdup("test");
fileNameProcess(str);
3 голосов
/ 16 июля 2010

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

fileNameProcess( "myfile.dat");

Строковые литералы не могут быть изменены.

Однако вы можете передать массив, инициализированный литералом:

char fname[] = "myfile.dat";

fileNameProcess( fname);

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

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