As you pointed out in the comments you are trying to split a string
into small strings
according to a separator, which is often called split
. In the case presented the separator to be considered is \n
, of change of line.
Your code has several small issues that do not allow it to work properly:
-
*linha = (int*)malloc(n*sizeof(int));
- Here the value pointed by the linha
pointer is an array of ints
, which can not be. Being linha
a int*
must point to an integer only. This same error is visible as compile warning:
assignment makes integer from pointer without a cast [enabled by
default]
The same goes for coluna
.
-
-
while (str[i]!='\n')
- Here you use a two-dimensional array while
but this does not have previously allocated space, either static or dynamic (with \n
), which will give you access to memory that does not it belongs to, and potentially give a Segmentation Fault .
-
i
- Finally the matriz[*linha][*coluna] = str[i];
is shown as a matriz
normal, that is a malloc
when it is actually printf("%s",matriz);
. The correct way to show is with a loop.
Trying to pick up on the logic you have and change it so that you can do split, you can use another approach. What is usually simpler is to count the number of separators that exist and with that amount allocate the array to those matriz
. Then each string is allocated as it goes through the original sentence and considering each of its sizes:
int size=0;
char str[]="Ola. Tudo bem?\n Sim e contigo?\n\n Comigo esta tudo bem! Que tens feito?\n Trabalho no projeto!\n";
size = strlen(str);
printf("%d\n",size);
int separadores = 0, i;
//contar quantos separadores existem
for (i=0; i < size; ++i){
if (str[i] == '\n'){
separadores++;
}
}
//a quantidade de elementos é o numero de separadores mais um
char **matriz = malloc(sizeof(char*)*(separadores+1));
int ultimo = 0, j=0;
//percorrer todas as linhas para construir cada string
for (i=0; i < size; ++i){
if (str[i] == '\n' || i == (size-1)){ //se apanhou um '\n' ou está no fim
if (i-ultimo > 1){ //if para considerar separadores seguidos
//criar espaço para a string que apanhada até esta letra. A string vai
//desde o ultimo indice até ao i, logo tem o tamanho i-ultimo
matriz[j] = malloc(sizeof(char)*(i-ultimo));
memcpy(matriz[j], str+ultimo, i-ultimo); //copia os carateres
matriz[j][i-ultimo]='memcpy(destino, origem, tamanho_em_bytes)
'; //coloca o terminador no fim pela vez do \n
j++; //j marca a string que se está a construir
}
ultimo=i+1;//atualiza o inicio da próxima string
}
}
//mostrar todas as strings construidas. A quantidade delas é dada por j
for(i=0; i < j;++i){
printf("%s\n",matriz[i]);
}
See the example of this logic in Ideone
Note that I used the string
function to simplify the code itself, but it only copies bytes from one site in memory to another. I could implement this logic by hand using a simple char*
. The function signature is:
int size=0;
char str[]="Ola. Tudo bem?\n Sim e contigo?\n\n Comigo esta tudo bem! Que tens feito?\n Trabalho no projeto!\n";
size = strlen(str);
printf("%d\n",size);
int separadores = 0, i;
//contar quantos separadores existem
for (i=0; i < size; ++i){
if (str[i] == '\n'){
separadores++;
}
}
//a quantidade de elementos é o numero de separadores mais um
char **matriz = malloc(sizeof(char*)*(separadores+1));
int ultimo = 0, j=0;
//percorrer todas as linhas para construir cada string
for (i=0; i < size; ++i){
if (str[i] == '\n' || i == (size-1)){ //se apanhou um '\n' ou está no fim
if (i-ultimo > 1){ //if para considerar separadores seguidos
//criar espaço para a string que apanhada até esta letra. A string vai
//desde o ultimo indice até ao i, logo tem o tamanho i-ultimo
matriz[j] = malloc(sizeof(char)*(i-ultimo));
memcpy(matriz[j], str+ultimo, i-ultimo); //copia os carateres
matriz[j][i-ultimo]='memcpy(destino, origem, tamanho_em_bytes)
'; //coloca o terminador no fim pela vez do \n
j++; //j marca a string que se está a construir
}
ultimo=i+1;//atualiza o inicio da próxima string
}
}
//mostrar todas as strings construidas. A quantidade delas é dada por j
for(i=0; i < j;++i){
printf("%s\n",matriz[i]);
}
To use it, you must include char**
.
Documentation for the strings