Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/40: Рейтинг темы: голосов - 40, средняя оценка - 4.53
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28

Символьный динамический массив (printf/scanf)

25.03.2015, 20:47. Показов 8238. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему не работает? Проблема возникает, когда нужно вывести массив на экран. Возможно он неправильно считывается? Объясните, пожалуйста, в чём я ошибся.

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
// cymbol_massive.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale>
 
int _tmain(int argc, _TCHAR* argv[])
    {
    setlocale(0,"Russian");
    int n;
    printf("Введите количество элементов массива \a");
    do
    {
        scanf("%d",&n);
    }while(n<=0);
    char *a=new char[n];
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        scanf("%s",&a[i]);
    }
    printf("Массив: ");
    for(int i=0;i<n;i++)
    {
        printf("%с ",a[i]);
    }
    delete []a;
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2015, 20:47
Ответы с готовыми решениями:

Sizeof и Динамический символьный массив!
В первом примере sizeof показывает кол-во элементов в массиве! #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; void...

Динамический символьный массив с не фиксированным размером
char* temp_str = new char; std::cin &gt;&gt; temp_str; std::cout &lt;&lt; temp_str; // выводит введенное слово Мне необходимо было создать...

Ввод данных/выделение памяти (динамический символьный массив)
1. Если ли разница в таких двух вариантах объявления динамического символьного массива: а) char *string = (char*) malloc(N); б) char...

32
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
25.03.2015, 21:05
замените printf и scanf на cin и cout
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,258
25.03.2015, 21:07
Цитата Сообщение от andthenhesilenc Посмотреть сообщение
scanf("%s",&a[i]);
Читаете букву а %s - для строки
C++
1
a[i]=getc(stdin);
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
25.03.2015, 21:32  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// cymbol_massive.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include<iostream>
#include<cstdlib>
 
int main()
{
    char *arr;
    int size;
    setlocale(LC_ALL, "Russian");
    std::cout<<"Введите размер массива :"<<std::endl;
    std::cin>>size;
    arr = new char[size];
    std::cout<<"Заполните массив :"<<std::endl;
    for (int i = 0; i < size; i++)
        std::cin>>arr[i];
    std::cout<<std::endl;
    for (int i = 0; i < size; i++)
        std::cout<<" "<<arr[i];
    delete [] arr;
}
Нашёл на форуме ещё до создания темы. Как это сделать с cin и cout понятно. Интересно именно с scanf и printf.
Цитата Сообщение от ZSS
Читаете букву а %s - для строки
Если я ставлю %c, он 2 раза выполняет тело цикла за 1 шаг при этом не считывая вводимые значения при первом выполнении (в рамках 1 шага). Допустим, я задам число элементов 4, он считает a и b и в результате выдаст "c c c c". При замене строки " scanf("%s",&a[i]);" на предложенную вами ситуация осталась прежней.
0
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,258
25.03.2015, 21:56
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <iostream>
#include <clocale>
using namespace std; 
int main()
{
    setlocale(LC_ALL,"Russian");
    int n;
    cout<<"Введите количество элементов массива a:";
    do
    {
        cin>>n;
    }while(n<=0);
    char *a=new char[n+1];
    a[n]=0;  // конец текста терминальный ноль
    cout<<"Пользователь ввёл значение "<<n<<" В массиве будет "<<n<<" букв.\n";
    for(int i=0;i<n;i++)
    {
        cout<<"Введите "<<i+1<<" букву массива :";
        cin>>a[i];
    }
    cout<<"Получилась строка: "<<a;
    delete []a;
    return 0;
}
1
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
25.03.2015, 22:26  [ТС]
Хоть и не с prinf/scanf, однако огромнейшее спасибо!

Добавлено через 7 минут
А если потребуется вывести определенный элемент массива можно это сделать со строкой? Допустим первый, второй или последний элемент строки?
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
25.03.2015, 22:28
C++
1
cout<<a[0]<<a[1]<<a[last];
1
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 07:43  [ТС]
Думал, тут правила применимые к символьным массивам отличаются от правил применимых к числовым. Тогда это всё упрощает.
И вопрос на засыпку: почему программа зацикливается, когда я передаю ей значение EOF (Ctrl+Z, Enter)?
C++
1
2
3
4
5
6
7
while (n!=EOF){
    cout<<"Какую по счёту букву вы хотели бы вывести?\n";
    do
    {
        cin>>n;
    }while(n<=0);
    cout<<a[n-1]<<"\n";}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 07:49
Цитата Сообщение от andthenhesilenc Посмотреть сообщение
Если я ставлю %c, он 2 раза выполняет тело цикла за 1 шаг при этом не считывая вводимые значения при первом выполнении (в рамках 1 шага).
Бред.
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 08:00  [ТС]
Хорошо. Вот практическое подтверждение бреда. Что это такое и как с этим бороться?
Миниатюры
Символьный динамический массив (printf/scanf)  
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 08:21
Как раз опровержение. Подтверждение выглядело бы так: , или хотябы так: . На каждом шагу цикла i имеет строго определённое значение, если тело цикла с этим значением i выполнить дважды, а в теле написано, что надо вывести i+1, то одно и то же число будет выведено дважды. На твоём же скрине видно, что каждое число выведено лишь один раз.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 08:24
Воняет вводом при нечётных i+1 enter вместо символа.
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 08:51  [ТС]
Спасибо, теперь я разобрался. Каким образом это можно исправить? И почему он выводит "с с с с"?

Добавлено через 23 минуты
Аналогичный код для числового массива типа int работает на ура.
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
37
38
39
40
41
42
// test_dinamic_massive.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <locale>
 
int _tmain(int argc, _TCHAR* argv[])
    {
    setlocale(0,"Russian");
    int n;
    printf("Введите количество элементов массива \a");
    do
    {
        scanf("%d",&n);
    }while(n<=0);
    int *a=new int[n];
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        scanf("%d",&a[i]);
    }
    printf("Массив: ");
    for(int i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    int nel;
    printf("\nКакой элемент массива вывести? ");
    do
    {
        scanf("%d",&nel);
    }while(n<0);
    for (int i=0;i<1;i++)
    {
    printf("%d элемент массива = %d",nel,a[nel-1]);
    }
    printf("\n");
    delete []a;
    return 0;
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 09:28
Представлением числа не может быть пустая строка, или символ завершения ввода. А при вводе символа есть проблема: вводятся символы и клавише enter соответствует символ завершения ввода.
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 09:45  [ТС]
С этим разобрались, спасибо. Почему вот это работает не так, как должно?

Почему программа зацикливается, когда я передаю ей значение EOF (Ctrl+Z, Enter)?
C++
1
2
3
4
5
6
7
while (n!=EOF){
    cout<<"Какую по счёту букву вы хотели бы вывести?\n";
    do
    {
        cin>>n;
    }while(n<=0);
    cout<<a[n-1]<<"\n";}
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
26.03.2015, 09:53
а как должно ?объясните работу этого кода
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 09:56  [ТС]
Я хочу, чтобы программа выполняла запрос определённой буквы массива до тех пор пока я не передам ей значение EOF.
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 10:54  [ТС]
Даже вот так:
C++
1
2
3
4
5
6
do
    {
        cout<<"Введите номер буквы ";
        cin>>n;
        cout<<a[n-1]<<"\n";
    }while(n!=EOF);
Миниатюры
Символьный динамический массив (printf/scanf)   Символьный динамический массив (printf/scanf)  
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 11:40
Попробуй такую полумеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 do
    {
        scanf("%d",&n);
    }while(n<=0);
    char *a=new char[n];
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        scanf("%c",&a[i]);
    }
    printf("Массив: ");
    for(int i=0;i<n;i++)
    {
      std::cout<<a[i];
    }
. Что выведет?
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 11:59  [ТС]
Уже пробовал, не помогло, хотя надежды были. Получилось следующее:
Миниатюры
Символьный динамический массив (printf/scanf)  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2015, 11:59
Помогаю со студенческими работами здесь

printf/scanf
Возник вопрос. int main(void) { printf(&quot;Hello world&quot;); } Что происходит здесь? Подключение в дебаге хедера &lt;stdio.h&gt;...

Scanf and printf
Проблема состоит в том, что ввожу одно, а выводит другое. #include &lt;stdio.h&gt; struct Sportsman { int place; }; int...

Символы %ls и %lc в printf и scanf
Здравствуйте. wchar_t c; wchar_t str; c = _getwch(); // считывает символ правильно. Проверял, коды совпадают c unicode: // а -...

Проблема со scanf и printf
В общем, парни, выручайте. Прога не работает, при использовании scanf и printf (так надо по заданию), точнее, она работает, но либо выдает...

printf scanf проги
нужны проги со всеми возможными scanf и printf для практики, ничего кроме этого в проге не должно быть поидее язык си


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru