diff --git a/docs/samples/load_memory.cpp b/docs/samples/load_memory.cpp
index 365fb64c331a21b2a2d67fb35a4e5e0e3e44538b..1185944d430d52d73328ccb49e3c22baf46cfbe8 100644
--- a/docs/samples/load_memory.cpp
+++ b/docs/samples/load_memory.cpp
@@ -1,6 +1,7 @@
 #include "pugixml.hpp"
 
 #include <iostream>
+#include <cstring>
 
 int main()
 {
diff --git a/docs/samples/save_custom_writer.cpp b/docs/samples/save_custom_writer.cpp
index defcb33fff482b0b06dca21f2ccf747e65f327a4..6ea430024b649e0747391ec71933290de5efd4dd 100644
--- a/docs/samples/save_custom_writer.cpp
+++ b/docs/samples/save_custom_writer.cpp
@@ -1,8 +1,8 @@
 #include "pugixml.hpp"
 
 #include <string>
-
-#include <stdio.h>
+#include <iostream>
+#include <cstring>
 
 //[code_save_custom_writer
 struct xml_string_writer: pugi::xml_writer
@@ -97,19 +97,19 @@ int main()
     doc.load("<foo bar='baz'>hey</foo>");
 
     // get contents as std::string (single pass)
-    printf("contents: [%s]\n", node_to_string(doc).c_str());
+    std::cout << "contents: [" << node_to_string(doc) << "]\n";
 
     // get contents into fixed-size buffer (single pass)
     char large_buf[128];
-    printf("contents: [%s]\n", node_to_buffer(doc, large_buf, sizeof(large_buf)));
+    std::cout << "contents: [" << node_to_buffer(doc, large_buf, sizeof(large_buf)) << "]\n";
 
     // get contents into fixed-size buffer (single pass, shows truncating behavior)
     char small_buf[22];
-    printf("contents: [%s]\n", node_to_buffer(doc, small_buf, sizeof(small_buf)));
+    std::cout << "contents: [" << node_to_buffer(doc, small_buf, sizeof(small_buf)) << "]\n";
 
     // get contents into heap-allocated buffer (two passes)
     char* heap_buf = node_to_buffer_heap(doc);
-    printf("contents: [%s]\n", heap_buf);
+    std::cout << "contents: [" << heap_buf << "]\n";
     delete[] heap_buf;
 }