93 lines
3.1 KiB
C
93 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/**
|
|
* @brief Function to split a string into an array of strings
|
|
*
|
|
* @details This function splits a string into an array of strings using a
|
|
* delimiter character. The function allocates memory for the array of strings
|
|
* and the individual strings. The caller is responsible for freeing the memory
|
|
* allocated by this function.
|
|
*
|
|
* @param str The string to split
|
|
* @param delimiter The character to split the string by
|
|
*
|
|
* @return An array of strings
|
|
*/
|
|
char **split_str(const char *str, char delimiter) {
|
|
int count = 1; // Number of substrings (at least 1)
|
|
for (int i = 0; str[i] != '\0';
|
|
i++) { // Count the number of delimiters until the end
|
|
if (str[i] == delimiter)
|
|
count++;
|
|
}
|
|
|
|
// clang-format off
|
|
|
|
// Allocate memory for the array of strings (+1 for NULL terminator)
|
|
// Code format for those who don't know:
|
|
// | (char **) for casting, something C++ already does (we love C)
|
|
// | malloc for allocating memory
|
|
// | (count + 1) * sizeof(char *) for the size of the array of strings
|
|
// | now for the memory size, since we previously counted the number of
|
|
// | delimiters we can use that to allocate the memory for the strings
|
|
char **result = (char **)malloc((count + 1) * sizeof(char *));
|
|
if (!result)
|
|
return NULL; // In case there is not enough memory
|
|
|
|
// let's get real: string will be " /IAE/ /CHALLENGE/" (space at first too)
|
|
int start = 0, pos = 0;
|
|
int len = strlen(str); // Length of the string: 18
|
|
for (int i = 0; i <= len; i++) { // Loop through the string
|
|
if (str[i] == delimiter ||
|
|
str[i] ==
|
|
'\0') { // Found a delimiter or end of string (that would be "/")
|
|
int word_length = i - start; // Length of the word, in this case 1
|
|
result[pos] = (char *)malloc(
|
|
(word_length + 1) * sizeof(char)); // Allocate memory for the word,
|
|
// size would be 1 + char size
|
|
if (!result[pos]) {
|
|
// Free previously allocated memory in case of failure
|
|
for (int j = 0; j < pos; j++) {
|
|
free(result[j]);
|
|
}
|
|
free(result);
|
|
return NULL;
|
|
}
|
|
strncpy(result[pos], &str[start],
|
|
word_length); // Copy the string from start to word_length
|
|
result[pos][word_length] = '\0'; // Null terminate
|
|
pos++;
|
|
start = i + 1;
|
|
}
|
|
}
|
|
|
|
// clang-format on
|
|
|
|
result[pos] = NULL; // Null terminate the array of strings
|
|
return result; // Return the array of strings
|
|
}
|
|
|
|
int main(void) {
|
|
printf("--------[BONUS]--------");
|
|
char *str =
|
|
" /IAE/ /CHALLENGE/"; // Change this to test with different strings
|
|
char **vector = split_str(str, '/');
|
|
int i;
|
|
|
|
i = 0;
|
|
while (vector[i] != NULL) {
|
|
printf("Substring %d : %s\n", i + 1, vector[i]);
|
|
i++;
|
|
}
|
|
|
|
while (vector[i] != NULL) {
|
|
free(vector[i]);
|
|
i++;
|
|
}
|
|
|
|
free(vector);
|
|
return (0);
|
|
}
|