С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 39

Ошибка вывода данных в массиве строк

30.01.2013, 03:32. Показов 752. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Есть программа, где создается динамический массив строк, заносится туда информация с клавиатуры и выводится сам массив. Алгоритм рабочий, но волнует один момент в моем коде, а именно, если заменить функции puts() и gets() на printf() и scanf(), а именно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
printf ("Введите %d фамилий:\n",n);
    flushall();
    for (i = 0; i < n; i++)
    {
        massive[i] = new char [m];
        scanf ("%s",&massive[i]);
    }
        printf ("Результат:\n");
    for (i = 0; i < n; i++)
    {
        printf ("\n%s",massive[i]);
    }
то при такой замене, возникает ошибка программы на момент вывода результата. Возникает два вопроса: почему при использовании gets() и puts() всё ОК, а при printf() и scanf() возникает проблема? И как эту проблему решить? Хотя даже очень странно, при использовании для того куска кода сначала gets() потом printf () - все работает, если наоборот - сначала scanf() потом puts - ошибка программы. Помогите, пожалуйста.



Это рабочая программа без ошибок.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
 
void main ()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char **massive;
    int n,m,i,j;
    do
    {
        printf ("Введите размерность массива строк и количество символов для каждой строки через пробел: ");
        scanf ("%d %d",&n,&m);
    }
    while ((n <= 0) && (m <= 0));
    massive = new char *[n];
    printf ("Введите %d фамилий:\n",n);
    flushall();
    for (i = 0; i < n; i++)
    {
        massive[i] = new char [m];
        gets (massive[i]);
    }
    printf ("Результат:\n");
    for (i = 0; i < n; i++)
    {
        puts (massive[i]);
    }
    for (i = 0; i < n; i++)
        delete [] massive[i];
    delete [] massive;
    getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2013, 03:32
Ответы с готовыми решениями:

Ошибка вывода данных в файл
Помогите найти ошибку. Есть программа, которая выводит массив f из р=53 строк. В первой колонке х - целые числа от -26 до 26, во второй...

ошибка в массиве строк
Здравствуйте! Попыталась написать код программы,которая сортирует строки в файле (оканчивающиеся символом перевода строки) с помощью...

Ошибка в коде с признаками (свойствами) вывода данных
Добрый всем вечер, пытаюсь написать программу которая открывает уже существующий файл с занесенной информацией,выводит ее на экран и дает...

7
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
30.01.2013, 03:40
Цитата Сообщение от Cuurjol Посмотреть сообщение
C++
1
2
scanf ("%s",&massive[i]);
printf ("\n%s",massive[i]);
%s замени на %c
0
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 39
30.01.2013, 03:46  [ТС]
Цитата Сообщение от UnsKneD Посмотреть сообщение
%s замени на %c
У меня динамический массив строк же, а не символов...
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
30.01.2013, 03:58
Cuurjol, у тебя как раз массив символов.
массив строк выглядит вот так
C++
1
string Arr[5]{"111","222","333","444","555"};
0
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 39
30.01.2013, 04:13  [ТС]
Цитата Сообщение от UnsKneD Посмотреть сообщение
Cuurjol, у тебя как раз массив символов.
массив строк выглядит вот так
C++
1
string Arr[5]{"111","222","333","444","555"};
Это с использованием стринга. Хочу через char. Если через char, то появляется вместо одномерного масссива - двумерный массив massive[3][15] к примеру, где 3 - количество строк в массиве, 15 - длина каждой строки из 3 строк в этом массиве. Я использую динамическую память, соответственно у меня **massive. Ну и соответственно, то, что вы предлагаете заменить - это прочтение ровно одного символа в строке, которую я введу, что в результате, если при таком массиве, к примеру massive[3][15] в качестве первой строки введу фамилию Петров, то вывод будет только 3-х первых букв через enter. Опять же повторюсь - у меня динамический массив строк, а не символов (в количестве равном 1)
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
30.01.2013, 04:45
Cuurjol, у тебя massive[i] это первая буква каждой из фамилий.

Добавлено через 3 минуты
И тогда уже с твоим массивом нужно работать как с матрицей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <windows.h>
 
int main (void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char **massive;
    int n,m,i,j;
    do
    {
        printf ("Ââåäèòå ðàçìåðíîñòü ìàññèâà ñòðîê è êîëè÷åñòâî ñèìâîëîâ äëÿ êàæäîé ñòðîêè ÷åðåç ïðîáåë: ");
        scanf ("%d %d",&n,&m);
    }
    while ((n <= 0) && (m <= 0));
    massive = new char *[n];
    printf ("Ââåäèòå %d ôàìèëèé:\n",n);
    for (int i = 0; i < n; i++)
    {
        massive[i] = new char [m];
        for(int j = 0; j<m; j++){
        scanf("%c", &massive[i][j]);
        };
    }
    printf ("Ðåçóëüòàò:\n");
    for (int i = 0; i < n; i++)
    {
        for(int j = 0; j<m; j++){
            printf("%c", massive[i][j]);
        };
    }
    
    for (i = 0; i < n; i++)
       delete [] massive[i];
    delete [] massive;
}
0
0 / 0 / 0
Регистрация: 01.01.2013
Сообщений: 39
30.01.2013, 22:55  [ТС]
Цитата Сообщение от UnsKneD Посмотреть сообщение
Cuurjol, у тебя massive[i] это первая буква каждой из фамилий.

Добавлено через 3 минуты
И тогда уже с твоим массивом нужно работать как с матрицей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <windows.h>
 
int main (void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char **massive;
    int n,m,i,j;
    do
    {
        printf ("Ââåäèòå ðàçìåðíîñòü ìàññèâà ñòðîê è êîëè÷åñòâî ñèìâîëîâ äëÿ êàæäîé ñòðîêè ÷åðåç ïðîáåë: ");
        scanf ("%d %d",&n,&m);
    }
    while ((n <= 0) && (m <= 0));
    massive = new char *[n];
    printf ("Ââåäèòå %d ôàìèëèé:\n",n);
    for (int i = 0; i < n; i++)
    {
        massive[i] = new char [m];
        for(int j = 0; j<m; j++){
        scanf("%c", &massive[i][j]);
        };
    }
    printf ("Ðåçóëüòàò:\n");
    for (int i = 0; i < n; i++)
    {
        for(int j = 0; j<m; j++){
            printf("%c", massive[i][j]);
        };
    }
    
    for (i = 0; i < n; i++)
       delete [] massive[i];
    delete [] massive;
}

Работает, но не совсем так, как я планировал. Смотрите, а можно ли сделать так, чтобы, когда я ввожу значение длины каждой строки в таком массиве (к примеру, опять же 3 строки длиной в 15 символов каждая), не было ввода ровно 45 символов? Фамилии разной длины бывают, не ровно же по 15 символов. Когда были gets() и puts(), то как бы все удачно выходило Если да, то как?
0
алкокодер
 Аватар для UnsKneD
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
01.02.2013, 07:01
Cuurjol, scanf_s(), я попробовал, но у меня как то криво всё вывелось в консоли потом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2013, 07:01
Помогаю со студенческими работами здесь

Ошибка при замене строк в двумерном массиве
Дан двумерный массив, в котором нужно поменять 1 и последнюю строчку, 2 и предпоследнюю и т.д. Выдает ошибку (указал в виде комментария в...

Перегрузка оператора вывода в С++ (для вывода данных вектора)
Как правильно перегрузить оператор вывода для вектора чтобы он выводил все данные из вектора ? Для этого класса есил можно помогите. ...

Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки
Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки таблицы; - ввода и...

Ошибка вывода строк
Вывести на экран матрицу символов таблицы ASCII, чередуя выводимые символы пробелами и вставляя пустые строки между строками.Обеспечить...

Запрет вывода строк содержащих значение #Ошибка
Подскажите пожалуйста как в можно в запросе указать такое условие отбора, чтобы строка содержащая значение &quot;#Ошибка&quot; не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru