Index: src/pdep.cc
===================================================================
--- src/pdep.cc	(revision 1862)
+++ src/pdep.cc	(working copy)
@@ -473,7 +473,7 @@
   }
 #ifdef USE_AS_STANDALONE
   const sentence_t* parser::parse (const char* sent, size_t len) {
-    _s->clear ();
+    _s->clear (true);
     if (! len) len = std::strlen (sent);
 #ifdef USE_UNI_POS
     char ret[IOBUF_SIZE];
@@ -497,7 +497,7 @@
   { return parse (sent, len)->print_tostr (_opt.input, _opt.verbose < 0); }
 #endif
   const sentence_t* parser::parse_from_postagged (char* result, size_t len) {
-    _s->clear ();
+    _s->clear (true);
     if (! len) len = std::strlen (result);
     //
     char *r = result + len - 4;
@@ -516,7 +516,7 @@
   const char* parser::parse_from_postagged_tostr (char* result, size_t len)
   { return parse_from_postagged (result, len)->print_tostr (_opt.input, _opt.verbose < 0); }
   const sentence_t* parser::read_result (char* result, size_t len) {
-    _s->clear ();
+    _s->clear (true);
     if (! len) len = std::strlen (result);
     //
     char *r = result + len - 4;
Index: src/pdep.h
===================================================================
--- src/pdep.h	(revision 1862)
+++ src/pdep.h	(working copy)
@@ -696,10 +696,11 @@
       delete chunk0;
       delete token0;
     }
-    void clear () {
+    void clear (bool reset = false) {
       if (chunk_num)
         do { _chunks[--chunk_num].clear (); } while (chunk_num);
       token_num = 0;
+      if (reset) _ptr = &_res[0];
     }
     chunk_t* chunk (const int i) const { return i >= 0 && i < chunk_num ? &_chunks[i] : chunk0; }
     token_t* token (const int i) const { return i >= 0 && i < token_num ? &_tokens[i] : token0; }
@@ -808,6 +809,7 @@
           }
         }
       std::memcpy (_ptr, "EOS\n", 4); _ptr += 4;
+      *_ptr = '\0';
       return &_res[0];
     }
     void print (const input_t in, bool prob) {
