Когда вы используете функции getchar (3) или gets (3), вход считывается со стандартного ввода процесса.
Функция getchar () эквивалентна getc (stdin).
Поскольку программа читает читает по одному символу за раз, вам нужно будет считать прочитанные символы и убедиться, что вы не «выходите за пределы доступного пространства».Это означает, что вам нужно передать «размер» s.
char*
mygets(char *s) {
//is s a valid pointer to memory?
//how much space is available in s?
int i = 0, ch;
//what is the maximum value of an int?
//what happens when i++ exceeds MAX_INT?
//does -1 make sense?
//getchar(3) can return EOF
while ((ch = getchar()) != '\n')
s[i++] = ch;
s[i] = '\0';
return s;
}
Попробуйте вместо этого что-то подобное.Считайте прочитанные символы, убедитесь, что вы не запускаете конец переданного буфера, и
char*
mygets(char* s, const size_t size) {
if( !s ) return s; //error, null pointer passed
size_t count=0;
char* sp = s;
int ch;
for( ; (count<size) && ((ch = getchar()) != EOF); ) {
++count; //count each character read, but not EOF
if( (*sp++ = ch) == '\n' ) break; //store characters read, check for newline
}
*sp = '\0'; //null terminate s
return s;
}
Вы должны передавать только нормальные значения для размера и разумные значения для s (допустимые буферы символов * 1013)* по крайней мере размер).Пример использования:
char buffer[999];
mygets(buffer, 999); //or mygets(buffer, sizeof(buffer));