Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2008, 01:09   #1
Stellvertreter
Пользователь
 
Регистрация: 12.10.2008
Сообщений: 12
По умолчанию Глюк(описание внутри)

получили некую строку s2, в которой слова разделены одним пробелом.
Теперь необходимо просто вывести каждое отдельное слово.

Алгоритм такой: находим пробел, выделяем память, копируем символы (от предыдущего пробела, который запоминается в q, до текущего).
В плане индексов все вроде правильно. Вопрос вот в чем:
Например я ввожу текст: Привет! Как дела?
Он выдает: Привет!=Как=дела?=
Если поменять значение выделяемой памяти, то выдаются вместо знака = звездочка(не умножение, а другая )

char* s3;
int q =0;
for (int i=0; i<=strlen(s2); i++)
{
if ((s2[i]==' ') || (s2[i]=='\0'))
{
int k;
s3 = new char[i-q+1];
for(k=q; k<i;k++)
{
s3[k-q]=s2[k];
}
s3[k-q+1] = '\0';
q=i+1;
printf(s3);
}
}
Stellvertreter вне форума Ответить с цитированием
Старый 13.10.2008, 08:46   #2
elnair
 
Регистрация: 03.10.2008
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stellvertreter Посмотреть сообщение
получили некую строку s2, в которой слова разделены одним пробелом.
Теперь необходимо просто вывести каждое отдельное слово.

Алгоритм такой: находим пробел, выделяем память, копируем символы (от предыдущего пробела, который запоминается в q, до текущего).
В плане индексов все вроде правильно. Вопрос вот в чем:
Например я ввожу текст: Привет! Как дела?
Он выдает: Привет!=Как=дела?=
Если поменять значение выделяемой памяти, то выдаются вместо знака = звездочка(не умножение, а другая )

char* s3;
int q =0;
for (int i=0; i<=strlen(s2); i++)
{
if ((s2[i]==' ') || (s2[i]=='\0'))
{
int k;
s3 = new char[i-q+1];
for(k=q; k<i;k++)
{
s3[k-q]=s2[k];
}
s3[k-q+1] = '\0';
q=i+1;
printf(s3);
}
}
ну лабы неплохо самому писать... потом же сложнее пойдет и никто на форуме тебе не будет париться просто так над кодом
elnair вне форума Ответить с цитированием
Старый 13.10.2008, 12:55   #3
Stellvertreter
Пользователь
 
Регистрация: 12.10.2008
Сообщений: 12
По умолчанию

Да это не лаба, мне просто надо для работы С освоить, и я решил помочь другу в написании проги.
Я не прошу разбираться в коде, просто как бы окиньте ее взглядом, может у меня ошибка налицо
Stellvertreter вне форума Ответить с цитированием
Старый 13.10.2008, 13:21   #4
Stellvertreter
Пользователь
 
Регистрация: 12.10.2008
Сообщений: 12
По умолчанию

Короче, после долгого разбора вопрос свелся к следующему.
Если я копирую элементы из одной строки в другую, как вручную добавить символ конца строки?
Такая запись, как я понял, вызывает глюки
s[i]='\0';
Stellvertreter вне форума Ответить с цитированием
Старый 14.10.2008, 06:05   #5
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Stellvertreter Посмотреть сообщение
Короче, после долгого разбора вопрос свелся к следующему.
Если я копирую элементы из одной строки в другую, как вручную добавить символ конца строки?
Такая запись, как я понял, вызывает глюки
s[i]='\0';
лень разбираться в твоем коде.
месяц назад писал скриптег для переработки тестового лога в html документ -
здесь все работает:
Код:
#include <fstream>

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
   if(argc!=3)
   {
      cout << "\nIncorent parameters!\n";
      exit(1);
   }
   ofstream outfile;
   outfile.open(argv[2],ios::app);
   outfile << "<!DOCTYPE HTML PUBLIC \"-//w3c//dtd html 4.0 Transitional//en\">" << endl;
   outfile << "<html>" << endl
               << "<head>" << endl
               <<"<title>" <<argv[1] <<"</title>" << endl
               <<"</head>" << endl
               <<"<body>" << endl
               <<"<table border=2>" << endl
               <<"<caption align=top>"<<argv[1]<<"</caption>" << endl;
   ifstream infile;
   infile.open(argv[1]);
   char buff[120];
   char temp[40];
   int len=0;
   int c=0;
   while(!infile.eof())
   {
      infile.getline(buff,120);
      len=strlen(buff);
      outfile << "<tr>" << endl;
      for(int i=0;i<len;i++)
      {
         temp[c]=buff[i];
         ++c;
         if(temp[c-1]==';' || i==(len-1))
         {
            temp[c-1]='\0';
            outfile << "<td>" << temp << "</td>"<< endl;
            c=0;
         }
      }
      outfile << "</tr>" << endl;
   }
   infile.close();
   outfile << "</table>" << endl
            <<"</body>"<< endl
            <<"</html>"<<endl;
   outfile.close();
   return 0;
}
ниже прикреплен бинарник для linux(!)
Вложения
Тип файла: zip a.out.zip (4.8 Кб, 12 просмотров)
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 14.10.2008, 21:04   #6
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию

Код:
int main()
{
        char* s3;
        int q = 0;

        char* s2 = "word1 word2";

        for (int i=0; i<=strlen(s2); i++)
        {
                if ((s2[i]==' ') || (s2[i]=='\0'))
                {
                        int k;
                        s3 = new char[i-q];

                        for(k=q; k<i; k++)
                        {
                                s3[k-q]=s2[k];
                        }

                        s3[k-q] = '\0';
                        q=i+1;
                        printf("%s\n",s3); // "%s\n" добавлено чтобы каждое слово выводилось на отдельной строке, если это не нужно, можно убрать, тогда будет выводится слитно word1word2
                }
        }
}
Вот так работает.
Skoverdrive вне форума Ответить с цитированием
Старый 16.10.2008, 19:31   #7
Stellvertreter
Пользователь
 
Регистрация: 12.10.2008
Сообщений: 12
По умолчанию

Да, спасибо, я понял.
Там дело было в том, что я не учел, что на выходе из цикла значение счетчика увеличивается на единицу)).
Stellvertreter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание структур и массивов в оконной форме mdrake Общие вопросы C/C++ 2 15.05.2008 14:18
Программа. Паскаль. Описание внутри. Nexx Помощь студентам 5 07.12.2007 20:07
QIP Dll's Описание у кого есть? LEKA Win Api 10 18.05.2007 08:55