0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
1

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

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

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

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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2015, 20:47
Ответы с готовыми решениями:

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

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

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

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

32
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 12:13 21
Author24 — интернет-сервис помощи студентам
Нда, понятного мало.
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<<"]="<<a[i];
    }
?
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 12:41  [ТС] 22
Вот так.
Миниатюры
Символьный динамический массив (printf/scanf)  
0
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
26.03.2015, 12:47 23
Цитата Сообщение от andthenhesilenc Посмотреть сообщение
C++
1
2
3
4
5
6
7
...
scanf("%d",&n);
...
printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
...
scanf("%s",&a[i]);
...
правильно:
C++
1
2
3
4
5
6
7
...
scanf("%i",&n);
...
printf("Пользователь ввёл значение %i. В массиве будет %i элементов.\n",n,n);
...
scanf("%c",&a[i]);
...
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 12:52  [ТС] 24
Существенной разницы не возникло.
Миниатюры
Символьный динамический массив (printf/scanf)  
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 13:02 25
Цитата Сообщение от andthenhesilenc Посмотреть сообщение
Вот так.
Миниатюры
Символьный динамический массив (printf/scanf)
Вот теперь начинает проясняться: вывод тоже был кривой.
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<<"]="<<a[i]<<"("<<(int)(a[i])<<")"<<std::endl;
    }
?
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 13:06  [ТС] 26
Результат:
Миниатюры
Символьный динамический массив (printf/scanf)  
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.03.2015, 13:11 27
Ну точно enter вводится вместо символа.
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++)
    {
      printf("%с ",(a[i]));
    }
? Пока всё ещё полумера.
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 13:17  [ТС] 28
Результат:
Миниатюры
Символьный динамический массив (printf/scanf)  
0
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
26.03.2015, 13:23 29
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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    do
    {
        scanf("%d",&n);
    }while(n<=0);
    char *a=new char[n+1];
    a[n]=0;
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    char tmp;
    tmp=getchar();
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        a[i]=getchar();
        tmp=getchar();
    }
    printf("Массив: ");
    puts(a);
    getch();
    return 0;
}
1
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 13:40  [ТС] 30
Работает как часы:
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
// cymbol_massive.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <conio.h>
#include <locale.h>
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int n;
    do
    {
        scanf("%d",&n);
    }while(n<=0);
    char *a=new char[n+1];
    a[n]=0;
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    char tmp;
    tmp=getchar();
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        a[i]=getchar();
        tmp=getchar();
    }
    printf("Массив: ");
    puts(a);
    getch();
    return 0;
}
Добавлено через 1 минуту
Почему данная часть кода зацикливает функцию при передаче последней значения EOF. Вопрос ещё открыт:
C++
1
2
3
4
5
6
do
    {
        cout<<"Введите номер буквы ";
        cin>>n;
        cout<<a[n-1]<<"\n";
    }while(n!=EOF);
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
26.03.2015, 13:42 31
как вы передаете значение eof?
0
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
26.03.2015, 14:01 32
Цитата Сообщение от andthenhesilenc Посмотреть сообщение
cin>>n;
Вводится ЧИСЛО. Константа EOF равна -1. Поэтому цикл закончится, когда будет введено число -1
0
0 / 0 / 2
Регистрация: 04.03.2015
Сообщений: 28
26.03.2015, 20:12  [ТС] 33
Цитата Сообщение от Dimension
как вы передаете значение eof?
Пытался сделать это с помощью Ctrl+Z.
Цитата Сообщение от ZSS
Вводится ЧИСЛО. Константа EOF равна -1. Поэтому цикл закончится, когда будет введено число -1
Всё. Теперь я во всём разобрался. Думая от чего оттолкнуться в решении данной задачи, я взял за пример код программы написанной на языке Си, которая осуществляла подсчёт количества введённых символов и сортировала результат. Для того, чтобы закончить цикл, необходимо было передать значение EOF посредством нажатия клавиш Ctrl+Z.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
int с, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i]= 0;
while ((c = getchar()) != EOF)
if (c >= '0' && с <= '9' )
++ndigit[c - '0' ];
else if (c == ' ' || с == '\n' || с == '\t')
++nwhite;
else
++nother;
printf ("цифры =");
for (i=0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf (", символы-разделители = %d, прочие = %d\n", nwhite, nother);
}
Всем огромнейшее СПАСИБО, за то что помогли разобраться! Финальная версия кода и отчёт о стабильной работе прилагаются:
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
43
44
45
// cymbol_massive.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <conio.h>
#include <locale.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    int n;
    printf("Введите количество элементов массива \a");
    do
    {
        scanf("%d",&n);
    }while(n<=0);
    char *a=new char[n+1];
    a[n]=0;
    printf("Пользователь ввёл значение %d. В массиве будет %d элементов.\n",n,n);
    char tmp;
    tmp=getchar();
    for(int i=0;i<n;i++)
    {
        printf("Введите %d элемент массива ",i+1);
        a[i]=getchar();
        tmp=getchar();
    }
    printf("Массив: ");
    puts(a);
    
    do
    {
       printf("Введите номер буквы ");
       scanf("%d",&n);
       if (n==EOF)
       {
        printf("EOF\n");
       }
       else
       {
        printf("%c\n",a[n-1]);
       }
    }while(n!=EOF);
    return 0;
}
Миниатюры
Символьный динамический массив (printf/scanf)  
0
26.03.2015, 20:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2015, 20:12
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru