Break text and store in vector

2

I want the program to store only 1 sentence per line. Since each sentence is possible to be terminated according to the signs I show in my code example. It does this but when you print on the screen it does not print those same characters which indicate that you should change lines.

int main() {

//char str[] = "Ola. Tudo bem?\n Sim e contigo?\n Comigo esta tudo bem! Que tens feito?\n Trabalho no projeto!\n";
char str[] = "Utilizador 1 --> Bom dia! Tudo bem contigo?\nUtilizador 2 --> Comigo tudo excelente. Que tens feito?\nUtilizador 1 --> De momento estou a trabalhar num projeto e tu?\nUtilizador 2 --> Eu tenho estudado uma nova linguagem, Java. Bastante interessante. Devias experimentar.\nUtilizador 2 --> Talvez experimente quando tiver algum tempo livre!\n";
char **matriz = malloc(sizeof(char *) * 255);
int caractere,coluna,i;
int linha = 0;
matriz[linha] = malloc(255);
for (caractere = 0, coluna = 0; str[caractere] != '
int main() {

//char str[] = "Ola. Tudo bem?\n Sim e contigo?\n Comigo esta tudo bem! Que tens feito?\n Trabalho no projeto!\n";
char str[] = "Utilizador 1 --> Bom dia! Tudo bem contigo?\nUtilizador 2 --> Comigo tudo excelente. Que tens feito?\nUtilizador 1 --> De momento estou a trabalhar num projeto e tu?\nUtilizador 2 --> Eu tenho estudado uma nova linguagem, Java. Bastante interessante. Devias experimentar.\nUtilizador 2 --> Talvez experimente quando tiver algum tempo livre!\n";
char **matriz = malloc(sizeof(char *) * 255);
int caractere,coluna,i;
int linha = 0;
matriz[linha] = malloc(255);
for (caractere = 0, coluna = 0; str[caractere] != '%pre%'; caractere++, coluna++) {
    if (str[caractere] == '?' || str[caractere] == '...' || str[caractere] == '!'  || str[caractere] == '.') {
        matriz[linha][coluna] = '%pre%';
        matriz[linha] = realloc(matriz[linha], coluna + 1);
        matriz[++linha] = malloc(255);
        coluna = -1;
    } else {
        matriz[linha][coluna] = str[caractere];
    }
}
matriz = realloc(matriz, sizeof(char *) * linha);
for (i = 0; i < linha; i++) {
    printf("%s\n", matriz[i]);
}
'; caractere++, coluna++) { if (str[caractere] == '?' || str[caractere] == '...' || str[caractere] == '!' || str[caractere] == '.') { matriz[linha][coluna] = '%pre%'; matriz[linha] = realloc(matriz[linha], coluna + 1); matriz[++linha] = malloc(255); coluna = -1; } else { matriz[linha][coluna] = str[caractere]; } } matriz = realloc(matriz, sizeof(char *) * linha); for (i = 0; i < linha; i++) { printf("%s\n", matriz[i]); }

}

    
asked by anonymous 10.11.2017 / 19:56

1 answer

1

There it starts to complicate. I made changes that solve the problem, but I do not even know if it's what you need, there's no clear definition of the problem. I have interpreted that every line break should only be replaced. The remaining characters separate and then break.

I changed the strategy of the previous code. Now it takes all the characters and treats as the exception only the line break character and another exception to handle the ellipsis since they are 3 characters. You can not directly purchase more than one character, only if you use an auxiliary function.

I have not tested every situation. Actually I think a lot of things can go wrong in this algorithm if the data is not well normalized. To make a robust algorithm would be a lot of work, it would become a parser .

#include <stdlib.h>
#include <stdio.h>

int main() {
    char str[] = "\nUtilizador 1 --> Bom dia! Tudo bem contigo?\n\nUtilizador 2 --> Comigo tudo excelente. Que tens feito?\nUtilizador 1 --> De momento estou a trabalhar num projeto... E tu?\nUtilizador 2 --> Eu tenho estudado uma nova linguagem, Java. Bastante interessante. Devias experimentar.\nUtilizador 2 --> Talvez experimente quando tiver algum tempo livre!\n";
    char **matriz = malloc(sizeof(char *) * 255);
    int linha = 0;
    matriz[linha] = malloc(255);
    for (int caractere = 0, coluna = 0; str[caractere] != '
#include <stdlib.h>
#include <stdio.h>

int main() {
    char str[] = "\nUtilizador 1 --> Bom dia! Tudo bem contigo?\n\nUtilizador 2 --> Comigo tudo excelente. Que tens feito?\nUtilizador 1 --> De momento estou a trabalhar num projeto... E tu?\nUtilizador 2 --> Eu tenho estudado uma nova linguagem, Java. Bastante interessante. Devias experimentar.\nUtilizador 2 --> Talvez experimente quando tiver algum tempo livre!\n";
    char **matriz = malloc(sizeof(char *) * 255);
    int linha = 0;
    matriz[linha] = malloc(255);
    for (int caractere = 0, coluna = 0; str[caractere] != '%pre%'; caractere++, coluna++) {
        matriz[linha][coluna] = str[caractere];
        if (str[caractere] == '\n' || str[caractere] == '%pre%' || str[caractere] == '.' || str[caractere] == '!' || str[caractere] == '?') {
            if (str[caractere] == '.' && str[caractere + 1] == '.' && str[caractere + 2] == '.') {
                matriz[linha][++coluna] = str[++caractere];
                matriz[linha][++coluna] = str[++caractere];
            }
            if (str[caractere] == '\n' && coluna == 0) {
                coluna = -1;
                continue;
            }
            if (str[caractere] == '\n' || str[caractere] == '%pre%') {
                matriz[linha][coluna] = '%pre%';
            } else {
                matriz[linha][++coluna] = '%pre%';
                caractere++;
            }
            matriz[linha] = realloc(matriz[linha], coluna + 1);
            matriz[++linha] = malloc(255);
            coluna = -1;
        }
    }
    matriz = realloc(matriz, sizeof(char *) * linha);
    for (int i = 0; i < linha; i++) {
        printf("%s\n", matriz[i]);
    }
}
'; caractere++, coluna++) { matriz[linha][coluna] = str[caractere]; if (str[caractere] == '\n' || str[caractere] == '%pre%' || str[caractere] == '.' || str[caractere] == '!' || str[caractere] == '?') { if (str[caractere] == '.' && str[caractere + 1] == '.' && str[caractere + 2] == '.') { matriz[linha][++coluna] = str[++caractere]; matriz[linha][++coluna] = str[++caractere]; } if (str[caractere] == '\n' && coluna == 0) { coluna = -1; continue; } if (str[caractere] == '\n' || str[caractere] == '%pre%') { matriz[linha][coluna] = '%pre%'; } else { matriz[linha][++coluna] = '%pre%'; caractere++; } matriz[linha] = realloc(matriz[linha], coluna + 1); matriz[++linha] = malloc(255); coluna = -1; } } matriz = realloc(matriz, sizeof(char *) * linha); for (int i = 0; i < linha; i++) { printf("%s\n", matriz[i]); } }

See running on ideone . And no Coding Ground . Also put it in GitHub for future reference .

    
10.11.2017 / 21:13