Программа имеет неопределенное поведение, потому что вы используете неинициализированный указатель с неопределенным значением
char * name;
printf("enter name:");
gets(name);
Вам необходимо выделить память, в которой вы собираетесь читать строку.
Как для функции gets
тогда это действительно небезопасная функция и больше не поддерживается стандартом C. Вместо этого используйте стандартную C функцию fgets
.
Обратите внимание, что согласно стандарту C функция main без параметров должна быть объявлена как
int main( void )
И используя typedef как это
typedef char * string;
- плохая идея. Например, используя это имя typedef, вы не можете объявить указатель на постоянные данные, такие как
const char *p;
, потому что это объявление
const string p;
не эквивалентно приведенному выше объявлению, а означает следующее объявление
char * const p;
Программа может выглядеть, например, следующим образом
#include <stdio.h>
char * read( char *s, size_t n )
{
s[0] = '\0';
printf( "Enter name: " );
fgets( s, n, stdin );
return s;
}
int main( void )
{
enum { N = 100 };
char name[N];
printf( "%s", read( name, N ) );
}
Ее вывод может выглядеть следующим образом:
Enter name: rahul_
rahul_
Обратите внимание, что функция fgets
можно добавить введенную строку с символом новой строки '\n'
. Чтобы удалить его, вы можете использовать следующий трюк
#include <string.h>
//...
name[ strcspn( name, "\n" ) ] = '\0';