Тема: Вивід рядків із масиву колонками
Привіт Вам, форумчани!
Допоможіть, будь ласка, розібратись!
Я вирішив частково виконати завдання 5.17 із книги Кернігана і Рітчі. Воно полягає в тому, щоб реалізувати вивід рядків в колонки, і кожна колонка була відсортована певним способом (в алфавітному порядку, з урахуванням верхнього або нижнього регістрів і т. д.), ці способи задаються аргументами командного рядку.
Я хочу тільки вивести рядки в колонки. Ось як я намагаюсь це зробити:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STRING_NUMBER 100
#define MAX_STRING_LENGTH 128
#define MAX_COLUMNS 5
#define OUTPUT_AREA 60
/*
 * 
 */
// string_buffer: місце для зберігання рядків
char string_buffer[MAX_STRING_NUMBER][MAX_STRING_LENGTH];
// *string_ptr: масив покажчиків на рядкові константи
char *string_ptr[MAX_STRING_NUMBER];
// input: зчитує рядки із файлу і зберігає їх в місці, на яке вказує ptr_to_string
//        повертає кількість колонок або -1 в разі невдачі
int input(char **ptr_to_string, int size_of_string);
// output: виводить рядки із місця, куди вказує ptr_to_string у вигляді колонок
//         повертає -1 в разі невдачі
int output(char **ptr_to_string, int lines_number, int size_of_string);
int main(int argc, char** argv) {
    int nlines = 0; // кількість рядків
    
    if((nlines = input(string_ptr, MAX_STRING_LENGTH)) != -1){
        printf("There was %d string(s) read successfully\n", nlines);
    } else {
        return (EXIT_FAILURE);
    }
    if(output(string_ptr, nlines, MAX_STRING_LENGTH) != -1){
        printf("End of output\n");
    } else {
        return (EXIT_FAILURE);
    }
    
    return (EXIT_SUCCESS);
}
int input(char **pointer_to_string, int size_of_string){
    FILE *fp; // файловий покажчик
    int nlines; // кількість зчитаних рядків
    /* відкривання файлу для прочитування */
    fp = fopen("user_strings.txt", "r");
    if(fp == NULL) {
        perror("Error opening file");
        return (-1);
    }
    
    /* запис рядків в буфер і встановлення покажчиків на кожен із них */
    for( nlines = 0;
         fgets(string_buffer[nlines], size_of_string, fp) != NULL;
         nlines++ ){
        string_ptr[nlines] = string_buffer[nlines];
        printf("Operating line: %s", string_buffer[nlines]);
    }
    
    /* закривання файлу */
    fclose(fp);
    
    return nlines;
}
int output(char **ptr_to_string, int nlines, int str_length){
    char c;
    int i, j;
    int cols = 0; // кількість колонок для виводу
    int col_width = 0; // ширина колонки
    
    /* визначення кількості колонок */
    do{
        printf("Input number of columns (0 - default): ");
        scanf("%d", &cols);
    } while (cols < 0 || cols > MAX_COLUMNS);
    if (cols == 0){
        cols = 1;
    }
    
    /* визначення ширини колонок */
    /* кількість роздільників завжди на 1 більша ніж колонок */
    /* від загальної площі віднімаємо кількість колонок і 1 */
    /* результат ділимо на кількість колонок */
    col_width = ( OUTPUT_AREA - cols - 1 ) / cols;
    for(i = 0; i < cols; i++){
        putchar('|');
        for(j = 0; j < col_width; j++){
                putchar('=');
            }
    }
    putchar('|');
    putchar('\n');
    
    /* вивід тексту */
    //while(nlines-- > 0){
        for(i = 0; i < cols; i++){
                putchar('|');
                for(j = 0; j < col_width; j++){
                    c = string_buffer[i][j];
                    c != '\n' ? putchar(c) : putchar('n');
                }
        }
        putchar('|');
        putchar('\n');
    //}
    return 0;
}Вміст файлу user_strings.txt
1: Hello there
2: How are you doing
3: $0me special characters !@#$%^&*()-=_+їі
4: White spaces in next string
5: \t \t\t ;
6: Some new lines9: Empty next string
10: LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLong String
11: End
Проблема виникає із цим шматком коду:
        for(i = 0; i < cols; i++){
                putchar('|');
                for(j = 0; j < col_width; j++){
                    c = string_buffer[i][j];
                    c != '\n' ? putchar(c) : putchar('n');
                }
        }
        putchar('|');
        putchar('\n');Я працюю в середовищі NetBeans і в режимі зневадження відслідковував які значення приймає c. Так от, c коректно приймає всі значення, кожен із символів із масиву, але, якшо обрати вивід в 3 колонки, наприклад, то він буде таким:
Input number of columns (0 - default): 3
|==================|==================|==================|
n|2: How are you doi|3: $0me special ch|
Мав би починатись так:
Input number of columns (0 - default): 3
|==================|==================|==================|
|1: Hello there...
Головне, що я заміняв оператор ? : на if, і його тіло виконувалось (я поставив точки розбиття там), але після виконання функцій у вікно виводу нічого не виводилось, не можу зрозуміти в чому проблема, допоможіть, будь ласка.







