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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
#1

AnsiString обуляет char - C++

20.09.2012, 16:50. Просмотров 463. Ответов 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
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Form1->ComboBox1->SetFocus();       // Передача фокуса ComboBox1
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,TShiftState Shift)
{
if (Key == 13)  {
        ComboBox1->Items->Add(ComboBox1->Text);  
// Строка из окна редактирования заносится в ComboBox1
        ComboBox1->Text="";             // Очистка окна
}
}
void __fastcall TForm1::ComboBox1Select(TObject *Sender)
{
int n, i, nst,kod;
String got;
nst = ComboBox1->ItemIndex;             // Определение номера строки
AnsiString st = ComboBox1->Items->Strings[nst];
char* ss = st.c_str();  // Запись выбранной строки st
if (st[1] != ' ')   n = 1;              // Здесь и ниже ' ' - пробел
            else   n = 0;
for(i=1; i<st.Length(); i++)                // Просмотр символов строки st
            if(st[i] == ' ' && st[i+1] != ' ')
                     {
 
                          n++;}
 
 
if(n>1)
{
 
char **a;
int j=0;
a = new char*[n];
int lo=st.Length();
int k=0;
for(i=0;i<lo+1; i++)
{
c:
if(i==lo&&ss[i]=='\0'){goto v;}
if(k<0) {k=0;}
if(ss[i]!=' ')
{
k++;
}
else if((ss[i]==' '&&ss[i-1]==' ')||(ss[i]==' '&&i==0)){i++;goto c;}
else
{
v:
if(k>0)
{
a[j]=new char [k+1];
if(i!=lo){a[j][k]='\0';}
if(i==lo&&ss[i]==' '){goto x;}
for(int f=i;k>-1;a[j][k]=ss[f-1],f--)
k--;
}
else {
goto x;}
j++;
}
}
x:
 
 
int sch=j;
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
AnsiString s1;
AnsiString s2;
s1=a[j-1];
s2=a[j];
a[j-1]=s2.c_str();
a[j]=s1.c_str();
}
}

C++
1
2
3
4
5
6
7
8
9
10
11
for (int i=0;i<sch;i++){
Memo1->Lines->Add(a[i]);
}
Memo1->Lines->Add("");
delete []a;
 
 
}
 
}
//---------------------------------------------------------------------------
В выделином красным цветом куске проблема. При срабатывании на строке
s2=a[j];
после ее прохождения пропадает значение переменной a[j] при навидении пишет a[j]='' Хотя естественно переменные a[] не пустые а с текстом при в ходе, а на выходе из цикла в результат выводятся пустые строки. Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2012, 16:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос AnsiString обуляет char (C++):

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( - C++
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot convert char* to char теперь вроде...

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

3
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,800
Записей в блоге: 17
20.09.2012, 18:21 #2
C++
1
char* ss = st.c_str();  // Запись выбранной строки s
Нельзя так делать...

C++
1
2
char ss[255];
strcpy(ss,st.c_str() );
И откажитесь от goto.
0
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 542
20.09.2012, 19:25  [ТС] #3
Почему нельзя? Верхняя часть кода из учебника по программированию.
Чуть изменил то что красным цветом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
AnsiString s1;
AnsiString s2;
s1=a[j-1];
s2=a[j];
a[j-1]=s2.c_str();
a[j]=s1.c_str();
}
}
sch--;
}
Подскажите как именно подправить? В общем-то делал обычную сортировку по алфавиту.
То есть в моем понимании в результате в массиве 'a' я должен получить упорядоченную последовательность слов.

Добавлено через 1 минуту
И почему надо от goto отказываться... я его как раз очень люблю им пользоваться...

Добавлено через 53 секунды
Без goto цикл очень сложно переделать.

Добавлено через 53 минуты
Вот такой цикл*
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while(sch2>0){
j=sch;
while(j>1)
{
j--;
double f=strcmp(a[j-1], a[j]);
if(f>0)
{
AnsiString s1;
AnsiString s2;
s1=a[j-1];
s2=a[j];
a[j-1]=s2.c_str();
a[j]=s1.c_str();
}
}
sch--;
}
Входит в цикл нормальный массив, а выходит пустой, помогите исправить!?
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,800
Записей в блоге: 17
20.09.2012, 20:59 #4
C++
1
char* ss = st.c_str();  // Запись выбранной строки s
По тому как ss указатель, и указывает он на память выделенную AnsiString что опасно )

Про отказ goto в найдете любом учебнике...
Я же просто не буду читать такой код ) Употребление goto должно быть сильно обосновано иначе оно сильно запутывает код.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 20:59
Привет! Вот еще темы с ответами:

Ошибка: call of overloaded 'strchr(char&, char)' is ambiguous - C++
Здравствуйте, прога почему-то ругается на функцию strchr, вот кусок кода: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’ - C++
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в этот же файл с другим расширением ...

функция возвращает массив слов, содержащихся в текстовом сообщении char* Words(char *s) - C++
Стоит такая задача: функция должна возвратить массив слов, содержащихся в текстовом сообщении char* Words(char *s) Как это можно...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
20.09.2012, 20:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru