Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
1

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

07.06.2013, 19:34. Показов 888. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот пытаюсь сделать так,чтобы между словами был только 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2013, 19:34
Ответы с готовыми решениями:

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

Удаление из одномерного массива. ошибка в коде!
В одномерном массиве убрать все цепочки отрицательных элементов, расположенные между...

Удаление и добавление элементов массива - ошибка в коде
Здравствуйте, уважаемое сообщество. Прошу указать на ошибку в коде. Нужно создать массив из...

Создание программы со своей библиотекой ( удаление элементов с N по M в строке и удаление лишних пробелов(если 2 и более оставить один))
добрый день. помогите, пожалуйста понять мои ошибки в работе. Мне нужно написать программу со...

12
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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;
    }
}
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
07.06.2013, 19:44  [ТС] 3
А у меня какая ошибка?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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] элемент
0
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
07.06.2013, 19:50 5
дело в том, что где-то у тебя пустое место будет там, где повторялся пробел. Там ты в str[i] ничего не сохранял, так что там у тебя значение не определено. И еще char - строки в с++ нуль-терминированные, т.е. самый последний символ строки должен дыть равен символу с кодом NULL
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
07.06.2013, 20:02  [ТС] 6
Цитата Сообщение от MrGluck Посмотреть сообщение
вы ссылались бы даже на A[6] элемент
Получается 11-тая строка имеет такой вид
C++
1
for (i=1;i<=strlen(str)-2;i++)
?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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++)
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
07.06.2013, 20:05  [ТС] 8
Цитата Сообщение от mazukta26 Посмотреть сообщение
самый последний символ строки должен дыть равен символу с кодом NULL
то есть после редактирования массива в цикле надо написать ,допустим, str[i+1]="/0"?

Добавлено через 27 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
нет. Такой:
Почему -1,если я захожу аж на 2 элемента вперёд?
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 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
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
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'

Какую библиотеку нужно подключить для считывания аски-кода?
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 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;
}
0
12 / 12 / 8
Регистрация: 27.12.2012
Сообщений: 448
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;
}
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
08.06.2013, 05:07 13
Цитата Сообщение от triadec_96 Посмотреть сообщение
Что это?Никогда не видел.
перейти к следующей итерации цикла

Добавлено через 1 минуту
Цитата Сообщение от triadec_96 Посмотреть сообщение
C++
1
str2[i]=str[i];
Я же написал, что нужна вторая переменная для хранения позиции во втором массиве
Пост #11 разберите
0
08.06.2013, 05:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2013, 05:07
Помогаю со студенческими работами здесь

Удаление пробелов
Нужна программа , которая удаляет все пробелы в строке! Помогите пожалуйста!

Удаление пробелов
Доброго времени суток ув. форумчане! Дали задание до 6.11, вчера вроде понял как делать, а сегодня...

удаление пробелов
предложите 2 варианта функции, удаляющей из строки ведущие и концевые пробелы

Удаление пробелов
Доброго времени суток ув. форумчане! Дали задание до 6.11, вчера вроде понял как делать, а сегодня...


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

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