Jak prosty wyświetlić wprowadzony ciąg znaków w kolumnach?

0

Cześć, natknąłem się na zadanie, w którym program ma wczytać linie tekstu i wyświetlić w konsoli słowa w kolumnach, np.
wprowadzony tekst: prosty nowy przykład
wynik ma być w postaci:

p n p
r o r
o w z
s y y
t   k
y   ł
    a
    d

Jedyne co mi przychodzi na myśl to przeczesać tablice znaków i identyfikować słowa po wystąpieniu znaku spacji, kolejno tworzyć tablice które przechowuje te słowa i robić tak do konca wprowadzonego tekstu i na koncu wyswietlic te tablice za pomoca pętli do iteracji wyrazów dodając znak nowej lini. Macie jakieś prostsze pomysły?

0

Jakbym musiał koniecznie zrobić to bym zrobił na pliku ( plikach ).

0

Okej zrobiłem to w taki sposób, że linie tekstu wczytuje z pliku do tablicy jednowymiarowej d.
Następnie stworzyłem dwie funkcje, (ile_slow) przeczesuje tą linie tekstu i zwraca ilość słów w tej linii, a druga funkcja (najdluzszyWyraz) zwraca długość najdłuższego wyrazu w całej linii tekstu.
Te dwie dane używam do stworzenia tablicy 2d gdzie ilość kolumn wskazuje (ile_slow) a ilość wierszy (najdluzszyWyraz).
Następnie wypełniam spacjami całą tablice 2d prostym for-em, i potem robie kolejnego for-a, który wypełnia kolumnami te znaki z tablicy 1d do 2d.
Wypełnienie spacjami było po to, aby można było zrobić warunek że pętla napotka wartość spacji ' ' to przechodzi do nastepnej kolumny i spisuje kolejny wyraz juz w niej.

Myśle, że zarys jest ok tylko kurde wyskakuje mi błąd związany z pamięcią (kod pisałem w Virtual Studio), wklepałem błąd w AI zeby dowiedzieć się o co biega i wyskoczyło coś takiego:

"Błąd o kodzie -1073741819 jest jednym z popularnych kodów błędów w systemie Windows. Ten konkretny kod błędu to często wynik naruszenia pamięci, znane również jako Access Violation. Oznacza to, że program próbował uzyskać dostęp do obszaru pamięci, do którego nie miał uprawnień, co prowadzi do nieoczekiwanego zakończenia programu."

Za cholere nie widze gdzie jest ten błąd, jeśli ktoś zauważył i wskaże o co chodzi to będę wdzięczny
kod:

#pragma warning (disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 256
FILE* fd = NULL;
int ile_slow(char te[]);
int najdluzszyWyraz(char d[], int dlugosclinii);


int main() {
	char* d = NULL;
	d = (char*)malloc(MAX_LINE * sizeof(char));
	if(!d)
	{
		printf("Blad allokacji pamieci\n");
		exit(1);
	}

	int l = 0, dlugosclinii=0, max = 0;

	if (!(fd = fopen("DANE.txt", "r")))
	{
		printf("Blad otwarcia zbioru\n");
		exit(2);
	}
	
	

	while (fgets(d, MAX_LINE, fd) != (char*)NULL)
	{
		dlugosclinii = strlen(d);
		l += ile_slow(d);
		max = najdluzszyWyraz(d, dlugosclinii);
	}
	fclose(fd);
	fd = NULL;

	//tworzenie tabeli 2d
	char** tab;
	tab = (char**)malloc(sizeof(char*) * max);
	if (!tab)
	{
		printf("Blad allokacji pamieci\n");
		exit(3);
	}
	for (int i = 0; i < max; i++)
	{
		tab[i] = (char*)malloc(sizeof(char) * l);
		if (!tab[i])
		{
			printf("Blad allokacji pamieci\n");
			exit(4);
		}
	}
	
	//wypełnienie tabeli spacjami
	
	for (int i = 0; i < l; i++) {
		for (int j = 0; j < max; j++) {
			tab[i][j] = ' ';
		}
	}

	
	int col = 0;
	int row = 0;
	for (int j = 0; j < dlugosclinii; j++) 
	{
		if (d[j] != ' ') 
		{
			tab[col][row] = d[j];
			col++;
		}
		else 
		{
			col = 0;
			row++;
		}
	}

	printf("Wypelniona dwuwymiarowa tablica:\n");
	for (int i = 0; i < max; ++i) 
	{
		for (int j = 0; j < l; ++j) 
		{
			printf("%c ", tab[i][j]);
		}
		printf("\n");
	}

	if (tab)
	{
		for (int i = 0; i < max; i++)
		{
			if (tab[i])
			{
				free(tab[i]);
			}
		}
		free(tab);
		tab = NULL;
	}
	if (d)
		free(d);
	d = NULL;

	return 0;
}
int ile_slow(char te[])
{
	/* Ile jest slow w linii tekstu. Tablice w argumentach funkcji*/
	char p = ' ', b;
	int l = 0, i = 0;
	while (b = te[i++])
	{
		if (b != ' ')
			if (p == ' ') l++;
		p = b;
	}
	return l;
}
int najdluzszyWyraz(char d[],int dlugosclinii)
{
	int i = 0, licz=0, max=0;
	
	for (i = 0; i < dlugosclinii; i++) 
	{
		if (d[i] != ' ') {
			licz++;
		}
		else 
		{
			if (licz > max) 
			{
				max = licz;
			}
			licz = 0;
		}
	}
	// sprawdzam, czy ostatnie słowo jest najdłuższe
	if (licz > max) {
		max = licz - 1;
	}
	return max;
}
1

https://godbolt.org/z/aP3d6Gxad

=================================================================
==1==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000016 at pc 0x000000401d36 bp 0x7ffca1c144a0 sp 0x7ffca1c14498
WRITE of size 1 at 0x602000000016 thread T0
    #0 0x401d35 in main /app/example.c:55
    #1 0x7f665f629d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f) (BuildId: a43bfc8428df6623cd498c9c0caeb91aec9be4f9)
    #2 0x7f665f629e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f) (BuildId: a43bfc8428df6623cd498c9c0caeb91aec9be4f9)
    #3 0x402384 in _start (/app/output.s+0x402384) (BuildId: b1ce29ba5bc684d08364e410186dbb1d3ed0cb07)

0x602000000016 is located 0 bytes after 6-byte region [0x602000000010,0x602000000016)
allocated by thread T0 here:
    #0 0x7f66600539df in malloc (/opt/compiler-explorer/gcc-13.2.0/lib64/libasan.so.8+0xda9df) (BuildId: 5ce9c09d3612315d01d50bcaafaea176e7ddab77)
    #1 0x4014be in main /app/example.c:43

Moja wersja: https://godbolt.org/z/Ev1fjj9GG

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

#define MaxWordSize 31

typedef struct WordsList {
    char words[MaxWordSize + 1][MaxWordSize + 1];
    size_t wordCount;
} WordsList;

void WordsListRead(WordsList* words, FILE* in)
{
    char line[MaxWordSize * MaxWordSize];
    words->wordCount = 0;
    if (fgets(line, sizeof(line), in)) {
        int bytesRead = 0;
        char* readPos = line;
        while (words->wordCount < MaxWordSize && sscanf(readPos, "%31s%n", words->words[words->wordCount], &bytesRead) == 1) {
            readPos += bytesRead;
            ++words->wordCount;
        }
    }
}

size_t WordsListLongest(WordsList* words)
{
    size_t i;
    size_t longest = 0;
    for (i = 0; i < words->wordCount; ++i) {
        size_t l = strlen(words->words[i]);
        longest = longest < l ? l : longest;
    }
    return longest;
}

void StringPadLeft(char* s, size_t n, char padChar)
{
    while (*s && n) {
        s++;
        n--;
    }
    while (n) {
        *s++ = padChar;
        n--;
    }
    *s = 0;
}

size_t WordsListPadToLongestWord(WordsList* words, char padChar)
{
    size_t i;
    size_t destSize = WordsListLongest(words);
    for (i = 0; i < words->wordCount; ++i) {
        StringPadLeft(words->words[i], destSize, padChar);
    }
    return destSize;
}

void WordsListTranspose(WordsList* words)
{
    size_t i, j;
    size_t destSize = WordsListPadToLongestWord(words, ' ');

    for (i = 0; i < words->wordCount; ++i) {
        for (j = i + 1; j < destSize; ++j) {
            char tmp = words->words[i][j];
            words->words[i][j] = words->words[j][i];
            words->words[j][i] = tmp;
        }
        words->words[i][destSize] = 0;
    }
    words->wordCount = destSize;
}

void WordsListPrintInto(WordsList* words, FILE* out)
{
    size_t i;
    for (i = 0; i < words->wordCount; ++i) {
        fprintf(out, "%s\n", words->words[i]);
    }
}

void WordsListPrintColumnsInto(WordsList* words, FILE* out)
{
    size_t i;
    for (i = 0; i < words->wordCount; ++i) {
        const char* s = words->words[i];
        while (*s) {
            fprintf(out, "%c ", *s++);
        }
        fprintf(out, "\n");
    }
}

static const char Seperator[] = "-----------------------------\n";

int main()
{
    WordsList words = {};
    WordsListRead(&words, stdin);
    printf(Seperator);
    WordsListPrintInto(&words, stdout);
    printf(Seperator);
    WordsListTranspose(&words);
    WordsListPrintColumnsInto(&words, stdout);
    printf(Seperator);
}
0
#include <stdio.h>
#include <string.h>

#define decorative printf("\n");for (int i=0;i<border;++i,printf("-"));printf("\n");

int main()
{
    char line[1000],words[100][100];
    int rows=0,cols=0,border=0;

    while(printf("empty line ends the program. Enter text: ")&&fgets(line,sizeof(line),stdin))
    {
        line[strcspn(line,"\n")]=0;
        if(strlen(line)==0)break;
        char *word=strtok(line," ");
        while(word!=NULL){strcpy(words[cols],word);if(rows<strlen(word))rows=strlen(word);++cols;word=strtok(NULL," ");}
        border=cols*2-1;
        decorative
        for(int i=0;i<rows;++i){for(int j=0;j<cols;++j)i<strlen(words[j])?printf("%c ",words[j][i]):printf("  ");printf("\n");}
        decorative
        memset(words,0,sizeof(words));
        fflush(stdin);
        border=0,cols=0,rows=0;
    }
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1