how to convert vector<string> to const char**
This commit is contained in:
		
							parent
							
								
									782cb579e7
								
							
						
					
					
						commit
						3ac00a66ff
					
				
					 3 changed files with 70 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -22,3 +22,4 @@ future
 | 
				
			||||||
return-type-deduction
 | 
					return-type-deduction
 | 
				
			||||||
division
 | 
					division
 | 
				
			||||||
poly
 | 
					poly
 | 
				
			||||||
 | 
					ohai-const-strings
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ add_executable(bad_alloc bad_alloc.cpp)
 | 
				
			||||||
add_executable(rtti rtti.cpp)
 | 
					add_executable(rtti rtti.cpp)
 | 
				
			||||||
add_executable(poly poly.cpp)
 | 
					add_executable(poly poly.cpp)
 | 
				
			||||||
add_executable(division division.cpp)
 | 
					add_executable(division division.cpp)
 | 
				
			||||||
 | 
					add_executable(ohai-const-strings ohai-const-strings.cpp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_executable(future future.cpp)
 | 
					add_executable(future future.cpp)
 | 
				
			||||||
set_target_properties(future PROPERTIES LINK_FLAGS "-pthread")
 | 
					set_target_properties(future PROPERTIES LINK_FLAGS "-pthread")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										68
									
								
								ohai-const-strings.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								ohai-const-strings.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,68 @@
 | 
				
			||||||
 | 
					// how to convert std::vector<std::string> to const char**?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_strings(const std::vector<std::string> strings) {
 | 
				
			||||||
 | 
					  using std::cout;
 | 
				
			||||||
 | 
					  using std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cout << "== Printing some std::vector<std::string> strings:" << endl;
 | 
				
			||||||
 | 
					  for (const std::string &s : strings) {
 | 
				
			||||||
 | 
					    cout << s << endl;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char** convert_to_c(const std::vector<std::string> strings) {
 | 
				
			||||||
 | 
					  // Note: perfectly fine to "new" const char*.
 | 
				
			||||||
 | 
					  const char** strings_c = new const char*[strings.size()+1];
 | 
				
			||||||
 | 
					  for (size_t i = 0; i < strings.size(); ++i) {
 | 
				
			||||||
 | 
					    // XXX No need to copy the string here.
 | 
				
			||||||
 | 
					    char* string_c = new char[strings.at(i).size()+1];
 | 
				
			||||||
 | 
					    strncpy(string_c, strings.at(i).c_str(), strings.at(i).size()+1);
 | 
				
			||||||
 | 
					    strings_c[i] = string_c;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  strings_c[strings.size()] = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return strings_c;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void free_c(const char** strings_c) {
 | 
				
			||||||
 | 
					  for (size_t i = 0; strings_c[i] != NULL; ++i) {
 | 
				
			||||||
 | 
					    delete[] strings_c[i];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  delete[] strings_c;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_strings_c(const char** strings_c) {
 | 
				
			||||||
 | 
					  using std::cout;
 | 
				
			||||||
 | 
					  using std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cout << "== Printing some const char** strings:" << endl;
 | 
				
			||||||
 | 
					  for (size_t i = 0; strings_c[i] != NULL; ++i) {
 | 
				
			||||||
 | 
					    cout << strings_c[i] << endl;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void foo(const char* string) {
 | 
				
			||||||
 | 
					  printf("foo: %s\n", string);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main() {
 | 
				
			||||||
 | 
					  foo("foo");
 | 
				
			||||||
 | 
					  char* bar = new char[4];
 | 
				
			||||||
 | 
					  strncpy(bar, "bar", 4);
 | 
				
			||||||
 | 
					  foo(bar);
 | 
				
			||||||
 | 
					  delete[] bar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::vector<std::string> some_strings = { "just", "some", "strings", "here" };
 | 
				
			||||||
 | 
					  print_strings(some_strings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const char **some_strings_c = convert_to_c(some_strings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  print_strings_c(some_strings_c);
 | 
				
			||||||
 | 
					  free_c(some_strings_c);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue