Форум программистов, компьютерный форум CyberForum.ru

Почему неправильно выводится массив? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
NinoZombie
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.05.2011, 15:17     Почему неправильно выводится массив? #1
Не пойму... массив arr выводится неправильно, если его выводить в main.Получается что-то типа "-858993460" .В cifr он выводится нормально
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
/*Задан текст, состоящий из слов, записанных через запятые, и заканчивающийся точкой. 
Длина текста не больше 200 символов, могут быть использованы любые символы. 
Словом считать последовательность символов, не содержащую пробел. 
Выдать слова текста и их длины. Сформировать новую строку из слов, 
состоящих только из латинских букв, и длиной не более 7 символов. 
При этом все строчные буквы заменить на заглавные буквы. 
Найти массив сумм цифр цифровых слов.*/
 
int str_sl(char [200],char*,char*,char*[20]);
int is_latin(char* [20],int);
int cifr(char* [20],int);
char rezl[200];
 
void main()
{
    char x[200],*mslov[20];
    int i,n,cnt,arr[20],f;
    cout<<"Input string"<<endl;
    cin>>x;
    n=str_sl(x,",",".",mslov);
    for (i=0;i<n;i++)
    {
        cout<<"Word number "<<i+1<<" "<<mslov[i]<<" length  "<<strlen(mslov[i])<<endl;
    };
    cout<<endl;
    f=is_latin(mslov,n);
    if (f>0)
        cout<<"New string is "<<rezl<<"."<<endl<<endl;
    else 
        cout<<"We have no english words, who length < or = 7 in string"<<endl<<endl;
    cnt=cifr(mslov,n);
    if (cnt>0)
    {cout<<"Massive of digit's summ:"<<endl;
    for (i=0;i<cnt;i++)
        cout<<arr[i]<<endl;}
    else 
    cout<<"We have no only-digit words in string"<<endl;
    
    
}
 
//----------------------------------------------------
int str_sl(char x[200],char* rsl,char* kstr,char* mslov[20])
{int n=0;
char *adrz;
do {
adrz=strstr(x,rsl);
if (adrz==NULL)
adrz=strstr(x,kstr);
mslov[n]=new char[adrz-x];
strncpy(mslov[n],x,adrz-x);
mslov[n][adrz-x]='\0';
strcpy(x,adrz+1);
n++;
} while(strcmp(x,"")!=0);
return n;
}
 
//---------------------------------------------------------
int is_latin(char* mslov[20],int n)
{
char buk[27]="abcdefghijklmnopqrstuvwxyz";
int i=0,f=0;
for(i=0;i<n;i++) 
{
    if(strspn(mslov[i],buk)==strlen(mslov[i]) && strlen(mslov[i])<=7)       
    {strcat(rezl,strupr(mslov[i]));
    strcat(rezl," ");
    f=f+1;}
}
return f;
}
//---------------------------------------------------
int cifr(char* mslov[20],int n)
{
char cif[11]="0123456789";
int i,s,sum=0,cnt=0,arr[20];
for(i=0;i<n;i++) 
{
    if(strspn(mslov[i],cif)==strlen(mslov[i]))      
    {
        s=atoi(mslov[i]);
        while (s!=0) {sum=sum+s%10; s=s/10;}
        arr[cnt]=sum;
        cnt=cnt+1;
        sum=0;
    }
}
return cnt;
}
Добавлено через 1 час 35 минут
Может нужно чтобы функция cifr возвращала массив, а не счетчик?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.05.2011, 15:21     Почему неправильно выводится массив? #2
Ты выводишь не инициализированный arr .
Я не настаиваю, но, может, стоит инициализировать?
NinoZombie
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.05.2011, 15:26  [ТС]     Почему неправильно выводится массив? #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ты выводишь не инициализированный arr .
Я не настаиваю, но, может, стоит инициализировать?
я думал это
C++
1
int i,n,cnt,arr[20],f;
и есть инициализция А как это правильно сделать не подскажете?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.05.2011, 15:28     Почему неправильно выводится массив? #4
Это объявление
C++
1
int arr[size]={}; //объявление+инициализация
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.05.2011, 15:30     Почему неправильно выводится массив? #5
Это объявление переменной длиной 20 интов. Заполнен массив мусором.
А теперь тебе нужно присвоить значение каждому элементу массива. Точно так же, как ты его и выводишь:
arr[номер_элемента] = нужная_тебе_циферка.

Добавлено через 1 минуту
Цитата Сообщение от diagon Посмотреть сообщение
//объявление+инициализация
Насколько я помню, хотя бы один элемент необходимо указать ручками.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.05.2011, 15:32     Почему неправильно выводится массив? #6
Ну во-первых это для примера, а во вторых
C++
1
2
3
4
5
6
7
8
diagon@shadeware:~$ cat 1.cpp
#define size 10
int main(){
    int arr[size]={};
    return 0;
}
diagon@shadeware:~$ g++ 1.cpp
diagon@shadeware:~$           //компиляция прошла успешно=)
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
30.05.2011, 15:34     Почему неправильно выводится массив? #7
думаю решением в данном примере будет объявление глобального arr[20];
вне любой функции, тогда при вызове функции cif, массив заполнится значениями и в main по идее будет уже что выводить...поправьте если я неправ
NinoZombie
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.05.2011, 15:40  [ТС]     Почему неправильно выводится массив? #8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это объявление переменной длиной 20 интов. Заполнен массив мусором.
А теперь тебе нужно присвоить значение каждому элементу массива. Точно так же, как ты его и выводишь:
arr[номер_элемента] = нужная_тебе_циферка.

Добавлено через 1 минуту

Насколько я помню, хотя бы один элемент необходимо указать ручками.
мммм, а я думал он сам инициализируется, когда сделаю вот так
C++
1
cnt=cifr(mslov,n);
NinoZombie
0 / 0 / 0
Регистрация: 29.04.2011
Сообщений: 8
30.05.2011, 15:41  [ТС]     Почему неправильно выводится массив? #9
Цитата Сообщение от m1Rr0r Посмотреть сообщение
думаю решением в данном примере будет объявление глобального arr[20];
вне любой функции, тогда при вызове функции cif, массив заполнится значениями и в main по идее будет уже что выводить...поправьте если я неправ
спс, помогло
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.05.2011, 15:53     Почему неправильно выводится массив? #10
Цитата Сообщение от NinoZombie Посмотреть сообщение
когда сделаю вот так
Это два разных arr.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
30.05.2011, 16:04     Почему неправильно выводится массив? #11
Deviaphan,
а теперь один и тот же =))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2011, 16:09     Почему неправильно выводится массив?
Еще ссылки по теме:

C++ Почему при выводе в поток char* выводится весь массив символов?
Кол-во итераций выводится неправильно C++
C++ Почему выводится в виде таблицы и почему не работает сортировка

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.05.2011, 16:09     Почему неправильно выводится массив? #12
Цитата Сообщение от m1Rr0r Посмотреть сообщение
а теперь один и тот же =))
Но глобальный...
Yandex
Объявления
30.05.2011, 16:09     Почему неправильно выводится массив?
Ответ Создать тему
Опции темы

Текущее время: 23:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru