как вывести нормальную строку?

225
26 ноября 2017, 14:47

Всем привет. Столкнулся с проблемой. Пользователь вводит строку. По условию нельзя чтобы первый элемент строки был восклицательным знаком. Далее в строке должен быть обязательно восклицательный знак. Как скопировать содержимое строки до восклицательного знака (или обрезать строку). В моем соде при выводе "обрезанной строки" получается "кракозябра", как можно исправить?

    #include<iostream>
using namespace std;
int main()
{
    setlocale (LC_ALL, "rus");
    int CountSpace = 0, CountLit = 0, Index;
    char str [200] = "", str1[250] = "";
    do {
        cout << "Введите строку: "; //повторять ввод строки пока первый символ равен (!)
        gets_s(str);
        if(str[0] == '!')
        cout << "Первый символ строки <!>" << endl;
    } while (str[0] == '!');
    for(int i = 0; i < strlen(str); i++)
    {
        if(str[i] == '!')
        {Index = i;
        break;}
    }
    cout << "\nПервый <!> встречается на " << Index+1 << " позиции";
    strncpy(str1, str, Index-1);
    cout << str1;
        system ("pause");
        return 0;
    }
Answer 1

Начнем с того, что бы объявляете массив из одного нулевого символа

char str [] = ""

а потом читаете туда вообще неизвестно сколько

gets(str);

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

Но даже если бы у вас все было верно, и вы не пытались работать в невыделенной памяти, то учтите, что strncpy не записывает завершающий нулевой символ.

Вобщем, вот что вам нужно:

#include<iostream>
using namespace std;
int main()
{
    setlocale (LC_ALL, "rus");
    char str[300];
    do {
        cout << "Введите строку: "; //повторять ввод строки пока первый символ равен (!)
        gets_s(str,300);
        if(str[0] == '!')
            cout << "Первый символ строки <!>" << endl;
    } while (str[0] == '!');
    for(int i = 0; i < strlen(str); i++)
    {
        if(str[i] == '!')
        {
            str[i] = 0;
            break;
        }
    }
    cout << str << endl;
    system ("pause");
}
READ ALSO
Как вытащить из ListView, item DynamicAppearance текст

Как вытащить из ListView, item DynamicAppearance текст

Друзья, закинул на форму 2 ListView'аУ одного тип item'а простой, а другого тип item'а DynamicAppearance и добавил несколько TTextObjectAppearance со своими названиями

237
Выборка одного поля из БД

Выборка одного поля из БД

Как выбрать из базы только одно значение? Выборка происходит вот так

194
Парсинг XML &gt; 3 GB

Парсинг XML > 3 GB

Всем привет, необходимо поменять некоторые параметры в XML файле, со сложной структуройРанее данную задачу решал через DocumentFactoryBuilder, как оказалось...

186
Воспроизведение музыки в JAR

Воспроизведение музыки в JAR

Есть jar, который генерит IDEAВ нем прописан путь к файлу с музыкой

200