2014-11-21 6 views
0

Мой код здесь-Зачем нужна ошибка NZEC?

 void input(char* m) 
{ 
    char ch; 
    do 
    { 
     ch=getchar(); 
    } 
    while(ch=='\n'); 
    int i=0; 
    while(ch!='\n') 
    { 
     m[i++]=ch; 
     ch=getchar(); 
    } 
} 

дает ошибку NZEC. Тем не менее, если ограничить вход с характером рассчитывать Len, такие как this-

void input(char* m, int len) 
{ 
    char ch; 
    do 
    { 
     ch=getchar(); 
    } 
    while(ch=='\n'); 
    int i=0; 
    while(ch!='\n'&&i<len-1) 
    { 
     m[i++]=ch; 
     ch=getchar(); 
    } 
} 

она проходит вдоль штрафа. Почему это?

ответ

0

В первом случае у вас переполнение буфера!

Ваш while(ch!='\n') будет зацикливаться до «\ n», независимо от количества введенных символов. Если набрано больше символов, чем в буфере символов, указанном m, вы можете повредить память. Конечно, во втором случае len избежит этого.

Обратите внимание, что в обоих случаях вы не гарантируете нулевой ограничитель в своем буфере. Поэтому, если вы обрабатываете youd m как c-строку, вы также можете получить недостаточно памяти или переполнение буфера, поскольку строка может быть очень длинной.

Вы когда-нибудь задумывались определение вашей функции как:

void input(std::string& m) { 
    // ... 
    m.push_back(ch); // instead of m[i++]=ch 
    // ... 
} 
+0

значение строки, как известно заранее. Он не будет превышать буфер. Но я хотел бы знать, как добавить параметр длины, чтобы избежать ошибки во время выполнения? Их все еще может быть переполнение буфера. – goelakash

+1

Потому что в параметре длины вы передаете максимальную длину своего буфера, и цикл завершится, когда вы достигнете их, даже если у них все еще нет \ n. – Christophe

+0

Теоретически параметр длины может быть произвольным. Он может значительно превышать размер буфера. Я понимаю синтаксис. – goelakash

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