// C_ACM_gets.c #include // printf, feof, getchar #include // malloc, realloc #include // strlen /* ------------------------------------------------------------- */ // USE acm_gets() IN SITUATIONS WHERE YOU NEED TO PARSE AN // ARBITRARILY-LONG LINE THAT HAS KNOWN DELIMITERS, SUCH AS // "\n\r". int acm_getchar( const char *delim, char *c ) { *c = getchar( ); if( feof( stdin ) ) return( 1 ); return( strchr( delim, *c ) != NULL ); } char *acm_gets( const char *delim ) { char c; int size = 1; int pos = 0; char *buf = (char *)malloc( size ); while( !acm_getchar( delim, &c ) ) { buf[pos++] = c; if( pos == size ) { size *= 2; buf = (char *)realloc( buf, size ); } } buf = (char *)realloc( buf, pos + 1 ); buf[pos] = 0; return( buf ); } int main( int argc, char *argv[] ) { char *s; s = acm_gets( "~" ); printf( "%i\n", strlen( s ) ); free( s ); return( 0 ); }