Тема: Вивід рядків із масиву колонками
Привіт Вам, форумчани!
Допоможіть, будь ласка, розібратись!
Я вирішив частково виконати завдання 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, і його тіло виконувалось (я поставив точки розбиття там), але після виконання функцій у вікно виводу нічого не виводилось, не можу зрозуміти в чому проблема, допоможіть, будь ласка.