On Unix-like operating systems, there is a command named strings. This program displays all the human readable character sequences that are embedded in a binary file.
Create a program that works like strings, your program should require 1 argument specifying the file to look inside of. Each string that your program finds in the file should only contain printable characters or whitespace and the length of each string should be at least 4 characters. Each human readable string should be displayed on a new line.
For example, if my finished program is named "strings" and I run the program to have it analyze itself with the command ./strings strings, then I will get output that looks like:
/lib64/ld-linux-x86-64.so.2
Yr,O
libstdc++.so.6
__gmon_start__
_ITM_deregisterTMCloneTable
_ITM_registerTMCloneTable
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5clearEv
_ZNKSt9basic_iosIcSt11char_traitsIcEEcvbEv
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSt8ios_base4InitD1Ev
_ZNSolsEPFRSoS_E
__gxx_personality_v0
_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode
_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEc
_ZNSt8ios_base4InitC1Ev
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev
_ZSt4cout
_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4sizeEv
_ZNSi3getERc
_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev
libgcc_s.so.1
_Unwind_Resume
libc.so.6
__stack_chk_fail
isspace
isprint
__cxa_atexit
__cxa_finalize
__libc_start_main
GCC_3.0
CXXABI_1.3
GLIBCXX_3.4.21
GLIBCXX_3.4
GLIBC_2.4
GLIBC_2.2.5
P&y
dH3
%(
AWAVA
AUATL
[]A\A]A^A_
;*3$"
zPLR
GCC: (Ubuntu 7.2.0-8ubuntu3) 7.2.0
crtstuff.c
deregister_tm_clones
__do_global_dtors_aux
completed.7632
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
strings.cpp
_ZStL19piecewise_construct
_ZStL8__ioinit
_Z41__static_initialization_and_destruction_0ii
_GLOBAL__sub_I_main
__FRAME_END__
__GNU_EH_FRAME_HDR
_DYNAMIC
__init_array_end
__init_array_start
_GLOBAL_OFFSET_TABLE_
isspace@@GLIBC_2.2.5
_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
_edata
_IO_stdin_used
__cxa_finalize@@GLIBC_2.2.5
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
__dso_handle
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEpLEc@@GLIBCXX_3.4.21
DW.ref.__gxx_personality_v0
_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4sizeEv@@GLIBCXX_3.4.21
__cxa_atexit@@GLIBC_2.2.5
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21
_ZNSolsEPFRSoS_E@@GLIBCXX_3.4
__stack_chk_fail@@GLIBC_2.4
__TMC_END__
_ZNKSt9basic_iosIcSt11char_traitsIcEEcvbEv@@GLIBCXX_3.4.21
_ZSt4cout@@GLIBCXX_3.4
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5clearEv@@GLIBCXX_3.4.21
_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
__data_start
_ZNSi3getERc@@GLIBCXX_3.4
_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev@@GLIBCXX_3.4.21
__bss_start
_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
__libc_csu_init
__gxx_personality_v0@@CXXABI_1.3
_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5emptyEv@@GLIBCXX_3.4.21
_ITM_deregisterTMCloneTable
_Unwind_Resume@@GCC_3.0
isprint@@GLIBC_2.2.5
__libc_csu_fini
_ZStorSt13_Ios_OpenmodeS_
__libc_start_main@@GLIBC_2.2.5
__gmon_start__
_ITM_registerTMCloneTable
_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.gcc_except_table
.init_array
.fini_array
.dynamic
.data
.bss
.comment
The following standard library components should help you implement this program: