#include #include #include #include #include #define BUFSIZE 4096 #define MARGIN 50 int main(){ char buffer[BUFSIZE]; char extra_buffer[BUFSIZE-MARGIN]; size_t readlen = read(0, buffer, BUFSIZE); size_t number_end = 0, number_beginning = 0; double sum = 0; while(number_end < readlen){ for(; number_end < readlen && !isspace(buffer[number_end]); number_end++); buffer[number_end] = 0; sum += atof(buffer + number_beginning); for(number_beginning = number_end + 1; isspace(buffer[number_beginning]); number_beginning++); number_end = number_beginning; if(number_end > readlen - MARGIN){ // do we need to refill the buffer? size_t extra_readlen = read(0, extra_buffer, BUFSIZE-MARGIN); if(!extra_readlen) continue; strncpy(buffer, buffer+number_end, readlen - number_end); strncpy(buffer + (readlen - number_end), extra_buffer, extra_readlen); readlen = (readlen - number_end) + extra_readlen; number_beginning = number_end = 0; } } printf("%lf\n", sum); return 0; }