2010-07-15 2 views
1
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), но я не понимаю, почему это не позволяет мне это делать? почему я могу разрешить доступ к его чтению, но не могу изменить его? может кто-нибудь объяснить это в аспекте памяти. Я думаю, это потому, что строка передается в функцию. но до тех пор, пока я знаю место памяти, я мог бы исправить это правильно?C Ошибка записи указателя

благодаря

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

в его местоположение присвоить имя файла класса memeber символ * FilePath

+2

Если вы передаете константную строку в InputName, то вам 'будет пытаться изменить память только для чтения. Вы также должны были увидеть предупреждение компилятора, когда вы это сделали. Одна небольшая дополнительная точка: почему вы используете memset для изменения одного символа - почему бы не просто «name [i] =« _ »; –

+0

Вы также можете передать недопустимый указатель. Это const char *, иначе как он был создан? – Mau

+0

В вашем коде также не хватает прочего понимания. Почему вы делаете эти запутанные вещи в первую очередь? Нет необходимости в вашей «temp». Используйте только 'name [i]' всюду. И использование 'memset' для назначения символа в строке ... делает, как указывает Павел. –

ответ

6

Это:

if(1 < variable < 2) 

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

if(1 < variable && variable < 2) 

редактировать если (1 < < переменная 2) вычисляется следующим образом:

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 

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

+1

спасибо. Ты прав. это еще одна ошибка в моем коде. – Grey

+0

Можете ли вы расшифровать, почему if (1 Grey

+0

Результат оператора '' 'на самом деле определяется как 0 или 1 - вы * можете * полагаться на него. – caf

3

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

fileNameProcess("myfile.dat"); 

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

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

char fname[] = "myfile.dat"; 

fileNameProcess(fname); 

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

+0

Отличная точка зрения, я об этом не думал. – Daniel

+0

мой плохой. Я передал неправильный параметр функции .. ха-ха ... – Grey

4

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

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

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

char * str = strdup("test"); 
fileNameProcess(str); 
Смежные вопросы