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

Ошибка в коде.Удаление пробелов - C++

Восстановить пароль Регистрация
 
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 19:34     Ошибка в коде.Удаление пробелов #1
Вот пытаюсь сделать так,чтобы между словами был только 1 пробел.
Что не так с выводом и в чём моя ошибка?
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
#include <iostream>
#include <conio.h>
#include <string.h>
#include <string>
using namespace std;
int main()
{
    char str[255],str2[255],s1[255];
     int i,j;
 gets(str);
  for (i=1;i<=strlen(str);i++)
      if((ascii_cod(str[i]) == 32)&&(ascii_cod(str[i+1]) == 32))
           i++;
      else
       str2[i]=str[i];
 
   cout<<endl;
 
 
   for(i=0;i<=255;i++)
       cout<<str2[i];
 
 getch();
 return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 19:34     Ошибка в коде.Удаление пробелов
Посмотрите здесь:

C++ Удаление лишних пробелов
C++ Удаление начальных пробелов на С
C++ Удаление пробелов и строки
Удаление пробелов C++
Удаление пробелов в файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
07.06.2013, 19:42     Ошибка в коде.Удаление пробелов #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
void Trim_SD(char *dest, char *source)
{
    for (char *p1 = source, *p2 = dest; (*p2 = *p1); ++p1, ++p2)
    {
        if (*p1 != ' ')
            continue;
        while (*p1 == ' ')
            p1++;
        p2 += (p2 != dest && *p1);
        *p2 = *p1;
    }
}
 
int main()
{
    char c[100] = "Eniki    beniki eli    vareniki  ", c2[100];
    Trim_SD(c2, c);
    std::cout << c2 << "*";
}
(by Croessmah)

и моя:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
#include <sstream>
#include <string>
 
using namespace std;
 
int main()
{
    ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    ofstream o("output.txt");
    string str; // временная переменная для хранения слова
    while (!ifs.eof() && getline(ifs, str))
    {
        istringstream ist(str); // инициализируем строкой
        string word;
        while (ist >> word)
            o << word << " ";
        o << endl;
    }
}
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 19:44  [ТС]     Ошибка в коде.Удаление пробелов #3
А у меня какая ошибка?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
07.06.2013, 19:49     Ошибка в коде.Удаление пробелов #4
Цитата Сообщение от triadec_96 Посмотреть сообщение
for (i=1;i<=strlen(str);i++)
как минимум тут выход за пределы массива.
Элементы массива индексируются с 0 до n-1, где n - размер массива.
Т.е. например мы создаем A[5];
Он содержит элементы A[0], A[1], A[2], A[3], A[4], но A[5] это уже не элемент данного массива, а обычный выход за границу

Добавлено через 53 секунды
а у вас еще при обращении увеличивается индекс i, т.о. вы ссылались бы даже на A[6] элемент
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
07.06.2013, 19:50     Ошибка в коде.Удаление пробелов #5
дело в том, что где-то у тебя пустое место будет там, где повторялся пробел. Там ты в str[i] ничего не сохранял, так что там у тебя значение не определено. И еще char - строки в с++ нуль-терминированные, т.е. самый последний символ строки должен дыть равен символу с кодом NULL
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 20:02  [ТС]     Ошибка в коде.Удаление пробелов #6
Цитата Сообщение от MrGluck Посмотреть сообщение
вы ссылались бы даже на A[6] элемент
Получается 11-тая строка имеет такой вид
C++
1
for (i=1;i<=strlen(str)-2;i++)
?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
07.06.2013, 20:04     Ошибка в коде.Удаление пробелов #7
Цитата Сообщение от triadec_96 Посмотреть сообщение
for (i=1;i<=strlen(str)-2;i++)
нет. Такой:
C++
1
for (i=0; i < strlen(str) - 1; i++)
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 20:05  [ТС]     Ошибка в коде.Удаление пробелов #8
Цитата Сообщение от mazukta26 Посмотреть сообщение
самый последний символ строки должен дыть равен символу с кодом NULL
то есть после редактирования массива в цикле надо написать ,допустим, str[i+1]="/0"?

Добавлено через 27 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
нет. Такой:
Почему -1,если я захожу аж на 2 элемента вперёд?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11805 / 6784 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
07.06.2013, 20:09     Ошибка в коде.Удаление пробелов #9
Цитата Сообщение от MrGluck Посмотреть сообщение
как минимум тут выход за пределы массива.
ну как бы там еще '\0', который имеет индекс равный strlen(str) и согласно условия будет запихнут в массив str2
C++
1
2
3
4
      if((ascii_cod(str[i]) == 32)&&(ascii_cod(str[i+1]) == 32))
           i++;
      else
       str2[i]=str[i];
Добавлено через 3 минуты
Другое дело, что если условие выполнится, то i увеличится сразу на 2
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 20:09  [ТС]     Ошибка в коде.Удаление пробелов #10
warning C4996: 'gets' was declared deprecated
1>.\Lab6.cpp(12) : error C3861: 'ascii_cod': identifier not found
1>.\Lab6.cpp(12) : error C3861: 'ascii_cod': identifier not found
1>.\Lab6.cpp(17) : error C2440: '=' : cannot convert from 'const char [2]' to 'char'

Какую библиотеку нужно подключить для считывания аски-кода?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11805 / 6784 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
07.06.2013, 20:16     Ошибка в коде.Удаление пробелов #11
Вам всего лишь нужна вторая переменная-счетчик, чтобы запоминать позицию в массиве str2

Добавлено через 5 минут
Найдите отличия
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <conio.h>
#include <string.h>
#include <string>
using namespace std;
int main()
{
    char str[255],str2[255],s1[255];
     int i,j;
 gets(str);
  for (i=1,j=0;i<=strlen(str);i++)
      if(str[i] == 32 && str[i+1] == 32)
           continue;
      else
       str2[j++]=str[i];
   cout<<endl;
 
   cout<<str2;
 
 getch();
 return 0;
}
triadec_96
 Аватар для triadec_96
11 / 11 / 0
Регистрация: 27.12.2012
Сообщений: 427
Завершенные тесты: 1
07.06.2013, 21:20  [ТС]     Ошибка в коде.Удаление пробелов #12
Вот новый код
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
#pragma hdrstop
#include <iostream>
#include <conio.h>
#include <string.h>
#include <string>
#pragma argsusedf
using namespace std;
 
ascii_cod(char x)
{
int a;
a = x;
return a;
}
 
 
int main()
{
    char str[255],str2[255],s1[255];
     int i,j;
 gets(str);
  for (i=1;i<=strlen(str)-1;i++)
      if((ascii_cod(str[i]) == 32)&&(ascii_cod(str[i+1]) == 32))
           i++;
      else
       str2[i]=str[i];
 
   str2[i+1]="\";
       str2[i+2]="0";
 
   cout<<endl;
 
 
   for(i=0;i<=strlen(str)-1;i++)
       cout<<str2[i];
 
 getch();
 return 0;
}
Ну ведь нельзя 2 символа в элемент типа чар ,но как показать,что это конец строки?

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
continue;
Что это?Никогда не видел.

Добавлено через 8 минут
Вот конечный код,но что-то он не правильно работает:
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
#pragma hdrstop
#include <iostream>
#include <conio.h>
#include <string.h>
#include <string>
#pragma argsusedf
using namespace std;
 
int ascii_cod(char x)
{
int a;
a = x;
return a;
}
 
 
int main()
{
    char str[255],str2[255],s1[255];
     int i,j;
 gets(str);
  for (i=1;i<=strlen(str)-1;i++)
      if((ascii_cod(str[i]) == 32)&&(ascii_cod(str[i+1]) == 32))
           i++;
      else
       str2[i]=str[i];
 
   str2[i+1]=NULL;
 
   cout<<endl;
 
 
   for(i=0;i<=strlen(str)-1;i++)
       cout<<str2[i];
 
 getch();
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2013, 05:07     Ошибка в коде.Удаление пробелов
Еще ссылки по теме:

удаление пробелов C++
Удаление пробелов C++
C++ Удаление повторяющихся чисел. Ошибка в коде

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11805 / 6784 / 767
Регистрация: 27.09.2012
Сообщений: 16,839
Записей в блоге: 2
Завершенные тесты: 1
08.06.2013, 05:07     Ошибка в коде.Удаление пробелов #13
Цитата Сообщение от triadec_96 Посмотреть сообщение
Что это?Никогда не видел.
перейти к следующей итерации цикла

Добавлено через 1 минуту
Цитата Сообщение от triadec_96 Посмотреть сообщение
C++
1
str2[i]=str[i];
Я же написал, что нужна вторая переменная для хранения позиции во втором массиве
Пост #11 разберите
Yandex
Объявления
08.06.2013, 05:07     Ошибка в коде.Удаление пробелов
Ответ Создать тему
Опции темы

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