Вставить символ в слово между символами

177
15 декабря 2016, 16:00

Всем доброго времени суток.

Есть исходный массив, в который пользователь будет вводить текcт, есть массив под букву, которую нужно вставить в слово, и есть результирующий массив, в котором будет слово и вставленная буква в слове.

Как мне говорил учитель, что Word можно объявить как переменную, а не массив, но когда пользователь вводить букву, приложение просто крашится с окном ошибки (стоит windows xp).

Самая основная проблема, что при пересадке пропадает первая буква исходного текста! На самом деле важно то, что после того, как пользователь выбрал букву, у нас пропадает первая буква в исходном тексте, сам проверял.

Мне главное понять, почему буква пропала. Заранее спасибо за ответы и внимание!

Внизу есть закомментированые циклы, т.е. ввод букв до позиции и после.

Не обращайте внимание на копирование в цикле с 1, это я проверял, правда ли символ пропадает, я знаю, что с 0 надо вводить. Задачу я сам решил, всем спасибо!

#include <conio.h>
#include <string.h>
#include <iostream>
using namespace std;
main(){
  char text[10]; //наш исходный массив, предполагаемый текст - helloworld
  char word[1]; //(можно ли объявлять его не как массив?) наша буква
  char test[11]; //наш результирующий массив
  int position = 0, i; //позиция и счетчик
  printf("Enter text: ");
  gets(text); //вводим текст
  printf("%s", text); //проверяем, правильно ли введен (+правильно)
  printf("\nEnter word: ");
  fgets(word, 2, stdin); //вводим букву
  printf("%c", word[0]); //проверяем букву
  cout << "\nEnter position: ";
  cin >> position;
  cout << "\nPosition: " << position;
  position --; //мы считаем позицию с 0, пользователь с 1
  for(i = 0; i < 11; i++){ //перенос букв из исходного массива в результирующий, переносит правильно, а первая буква пропадает
    test[i] = text[i];
    printf("%c", test[i]); //отлавливаем, попадают ли буквы в результирующий массив
    getch();
    //if(i == position) не работает //попытка вставить заданную букву на позицию результирующего массива, а после неё продолжить вставлять буквы из исходного массива
      //test[i] = 0;
  }
  /*for(i = 1; i < 6; i++){
    printf("%c", test[i]);
    getch();
  }*/
    /*for(i = 0; i > position; i++){
      test[i] = text[i];
      printf("%c", test[i]);
      getch();  
    }*/
  getch();
}
Answer 1

Во-первых, не используйте gets, никогда. Представьте себе, что пользователь ввёл 100 символов — как вы думаете, что произойдёт? (Это важный вопрос, убедитесь, что вы в точности понимаете это.) И да, если функция доступна, это не значит, что использовать её хорошая идея.

Во-вторых, массивы в C (ну и в C++) нумеруются начиная с нуля. Поэтому ваш цикл копирования неверен.

В-третьих, да, под один символ вполне можно выделить переменную типа char. При этом вводить её при помощи fgets (да и gets) будет неправильно, т. к. эти функции дописывают в хвост строки \0. Ваш код сейчас тоже неверен, т. к. он выделяет лишь один символ, и тем самым не учитывает финальный \0 (это отвлекаясь от того факта, что пользователь программы может ввести сколько угодно символов, как раньше).

Исправьте это и смотрите дальше.

Ещё одно замечание: вы пишете на дикой смеси C и C++. В C++ массивы символов практически не используются в качестве строк, вместо них используется std::string. Сейчас это наверняка неважно, но станет важно позже. Если вам говорят, что C — подмножество C++, и код на C является правильным кодом на C++, можете сразу отмечать внутри, что этот человек плохо понимает и C, и C++. C — не подмножество C++, а его родовая травма: ради чисто маркетинговой идеи совместимости с C в C++ на уровне синтаксиса многие вещи в C++ реализованы ужасно.

Кстати, для операций со строками в C есть довольно много встроенных функций наподобие strcpy и strcat. Но лучше сначала поработать со строками вручную, эти функции делают именно то, что и вы делаете.

READ ALSO
Как нарисовать картинку с помощью OpenGl?

Как нарисовать картинку с помощью OpenGl?

Здравствуйте! Не подскажете, как нарисовать картинку с помощью OpenGl?

152
Делится ли число на 36 [закрыто]

Делится ли число на 36 [закрыто]

Здраствуйте помогите с программой (C++) Вводится одно число которое может быть максимум 1000 значным(соответственно его можно прочесть только...

157
Mutex для двух массивов

Mutex для двух массивов

Здравствуйте!

168
Readdir и C++

Readdir и C++

Есть код, который я нашел на просторах интернетаГлавная цель кода - показать все файлы в главной папке и подпапках

174