Меню

Ошибка при чтении символов строки си

RavilSHai

0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

1

Ошибка при чтении символов строки

16.02.2014, 21:13. Показов 13773. Ответов 12

Метки нет (Все метки)


Связана ли данная ошибка с этим:
<Имеется проблема, связанная с gets(), о которой следует знать: используя gets(), можно перейти границы массива, с которым она вызывалась. Это возможно, поскольку не существует способа указать gets(), где находится граница массива.>
Если же не с этим, тогда почему программа вылетает после ввода «perfomace»?

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
struct bd
{
    char *model;
    char *perfomace;
    int price;
};
 
struct format
{ char *resolutions;
  int  freak;
  int memory;
  struct bd notefun;
};
void main (void)
{
    struct format *notebook;
    int i,n,m;
    char s[909];
    printf ("Input size notebooks: ");
    scanf ("%d", &n);
    notebook=(format *)malloc(n*sizeof(format));
    for (i=0; i<n; i++)
    {
        printf ("nInput resolutions: ");
        scanf ("%d", &m);
        getchar ();
        gets (s);
        m=strlen(s);    
        (notebook+i)->resolutions=(char*)malloc(m);
        strcpy((notebook+i)->resolutions,s);
        printf ("nInput freak: ");
        scanf ("%d", &(notebook+i)->freak);
        printf ("nInput memory: ");
        scanf ("%d", &(notebook+i)->memory);
        printf ("nInput data notebook:");
        printf ("n   model:");
        getchar();
        gets (s);
        m=strlen(s);
        (notebook+i)->notefun.model=(char*)malloc(m+1);
        strcpy((notebook+i)->notefun.model,s);
        printf ("n   perfomace:");
        getchar();
        gets (s);
        m=strlen(s);
        (notebook+i)->notefun.perfomace=(char*)malloc(m+1);
        strcpy((notebook+i)->notefun.perfomace,s);
        printf ("n   price:");
        scanf ("%d", &(notebook+i)->notefun.price);
    }
    for (i=0; i<n; i++)
    {
        printf ("%s %d %d %s %s %d", i+1, (notebook+i)->resolutions,(notebook+i)->freak, (notebook+i)->memory, (notebook+i)->notefun.model,
            (notebook+i)->notefun.perfomace, (notebook+i)->notefun.price);
    }
    }

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт Java

4013 / 2615 / 475

Регистрация: 28.04.2012

Сообщений: 8,414

16.02.2014, 21:26

2

Что за ошибка-то? Телепаты в отпуске.



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 21:49

 [ТС]

3

Цитата
Сообщение от korvin_
Посмотреть сообщение

Что за ошибка-то? Телепаты в отпуске.

Упс
Прикрепил скрин



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 21:50

 [ТС]

4

Вот скрин

Миниатюры

Ошибка при чтении символов строки
 



0



Модератор

Эксперт по электронике

8756 / 6546 / 887

Регистрация: 14.02.2011

Сообщений: 22,962

16.02.2014, 22:00

5

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

(notebook+i)->resolutions=(char*)malloc(m);

сколько места выделяешь?
может тебе не хватает скопировать строку

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

strcpy((notebook+i)->resolutions,s);

короче когда выскакивает такая штука жмешь продолжить
она еще раз выскочит
жмешь прервать
программа остановится где то в дебрях библиотек
идешь в окошко стек вызовов и потихонечку добираешься до своего кода
тогда будет ясно кто с памятью хулиганит
если на первом же окошке нажмешь прервать программа может закрыться не заходя в отладчик

Добавлено через 1 минуту

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

notebook=(format *)malloc(n*sizeof(format));

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

(notebook+i)->resolutions=(char*)malloc(m);

почему не проверяешь, может тебе система памяти не дала?



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 22:31

 [ТС]

6

ValeryS
А я не знаю как проверить?



0



ValeryS

Модератор

Эксперт по электронике

8756 / 6546 / 887

Регистрация: 14.02.2011

Сообщений: 22,962

16.02.2014, 22:47

7

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

А я не знаю как проверить?

то что malloc возвращает сравнить с 0
если 0 значит память не выделена
например

C++
1
2
if((notebook=(format *)malloc(n*sizeof(format)))==0)
 // ошибка , что то делаем пишем или выходим из программы



0



RavilSHai

0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 23:18

 [ТС]

8

ругается что нельзя присваивать bool

Добавлено через 3 минуты
может проблема в этом участке?!

C
1
2
3
4
5
    for (i=0; i<n; i++)
    {
        printf ("%s %d %d %s %s %d", i+1, (notebook+i)->resolutions,(notebook+i)->freak, (notebook+i)->memory, (notebook+i)->notefun.model,
            (notebook+i)->notefun.perfomace, (notebook+i)->notefun.price);
    }



0



ValeryS

Модератор

Эксперт по электронике

8756 / 6546 / 887

Регистрация: 14.02.2011

Сообщений: 22,962

16.02.2014, 23:32

9

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

ругается что нельзя присваивать bool

со скобками не перемудрил?
у тебя видать notebook= приравнивается у результату сравнения
вот смотри
сначала вычисляется это
(notebook=(format *)malloc(n*sizeof(format)))
а потом результат сравнивается с 0 можно с NULL
можно расписать по строчкам

C++
1
2
3
notebook=(format *)malloc(n*sizeof(format));
if(notebook==NULL)
 // ошибка , что то делаем пишем или выходим из программы

Добавлено через 4 минуты

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

может проблема в этом участке?!

так на вскидку не вижу
нужен отладчик
а почему ты пользуешься адресной арифметикой а не индексами
так, по моему, удобней

C++
1
2
printf ("%s %d %d %s %s %d", i+1,notebook[i]->resolutions, notebook[i]->freak, notebook[i]->memory,notebook[i]->notefun.model,
notebook[i]->notefun.perfomace,notebook[i]->notefun.price);



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 23:40

 [ТС]

10

Так требует преподаватель, ну в смысле она показывала нам как должна быть прога написана



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 23:44

 [ТС]

11

Вот где он ругается

Миниатюры

Ошибка при чтении символов строки
 



0



Модератор

Эксперт по электронике

8756 / 6546 / 887

Регистрация: 14.02.2011

Сообщений: 22,962

16.02.2014, 23:53

12

смотри что возвращает предыдущая строка

Цитата
Сообщение от RavilSHai
Посмотреть сообщение

m=strlen(s);



0



0 / 0 / 4

Регистрация: 26.10.2012

Сообщений: 82

16.02.2014, 23:58

 [ТС]

13

готово

Миниатюры

Ошибка при чтении символов строки
 



0



Пытаясь делать курсовую работу, застрял вот на таком моменте:

...

Вот скриншот консоли на каком месте остановилась программа:

...

Я делаю решение системы линейных уравнений и думаю, что ошибка кроется в cout и cin, а именно в буфере ввода. Как я понял из информации в интернете, это происходит из-за того, что в нём остаётся символ n и от этого все проблема, но это не точно.

Когда убираешь <<z<< и остаётся просто: "Введите коэффициенты неизвестных уравнения через ;" << endl; — то программа продолжает работать и после ввода
коэффициентов, и вывода следующего cout опять та же ошибка. Уже пробовал всякие
cin.sync() и cin.clear(), но ничего не изменилось. Помогите пожалуйста и объясните как исправить.

#include <cuda.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include<locale.h>
#include<curand.h>
#include<curand_kernel.h>
#include<time.h>
#include <stdlib.h>
#include <string>
#include <cstdio>

using namespace std;

__global__ void vichislenie( int *index, float *mas, int *kolvoperem )
{
    int indexGPU = threadIdx.x + *kolvoperem - 1 ;
    //for
    //while (index < 33792)
    //{
    /*if (*number < mas1[index])
        *otvchislo = 0;*/
    //index += blockDim.x * gridDim.x;
    //}
}
/*float *randomer(float *mas)

{
for (unsigned short i = 0; i < 33792; i++)
    mas[i] = 0.01 * (rand() % 10100);


return mas;
}*/




int main( void )
{
    setlocale( LC_ALL, "RUS" );
    unsigned short kolvostrok = 0;
    int kolvoperem = 0;
    int index = 0;
    float *masOtvet = new float[kolvostrok];
    cout << "Введите кол-во неизвестных переменных:  ";
    cin >> kolvostrok;
    cout << "Введите кол-во уравнений:  ";
    cin >> kolvoperem;
    cout << "Введите правые части уравнений:  ";

    for( unsigned short i = 0; i < kolvostrok; i++ ) {
        cin >> masOtvet[i];
        cin.sync();
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        //int dummy; my_cin(dummy);
    }

    index = kolvostrok * kolvoperem;
    float *masKoefic = new float[index];

    for( unsigned short i = 0; i < index ; i++ ) {
        masKoefic[i] = 0.0;
    }

    char *str = new char[kolvoperem * 2 * kolvostrok * 16];

    for( unsigned short i = 0; i < ( strlen( str ) ); i++ ) {
        str[i] = ' ';
    }

    unsigned short schetchik = 1;
    unsigned short schetchik1 = 0;
    char *StrBufMas = new char[kolvoperem * 2 * 16];

    for( int z = 1; z < kolvostrok + 1; z++ ) {
        /*cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cin.clear();
        cin.get();*/
        cout << "Введите коэфициенты неизвестных уравнения "
             << z << " через ;" << endl;
        cout << "(если в уравнении не полное кол-во переменных, то вместо них поставить нули): "
             << endl;
        cin >> StrBufMas;
    }

    //scanf("%s", *StrBufMas);
    schetchik1 = 1;

    for( unsigned short i = 0; i < kolvoperem * 2 * kolvostrok * 16; i++ ) {
        if( ( str[i + 1] ) == ' ' ) {
            if( schetchik1 == 1 ) {
            }
            else {
                break;
            }

            for( unsigned short i = 0; i < strlen( StrBufMas ); i++ ) {
                str[i + schetchik] = StrBufMas[i];

                if( i == ( strlen( StrBufMas ) ) - 1 ) {
                    schetchik = schetchik + strlen( StrBufMas ) + 1;
                    schetchik1 = 0;
                }
            }
        }
    }

    /*size_t t = 6;
    char s1[10] = " tttrrrrr";
    char *s2 = new char[1];
    strcpy(s2, (s1-t));*/
    delete [kolvoperem * 2 * 16] StrBufMas, StrBufMas = NULL;
    schetchik = 0;
    schetchik1 = 0;
    char StrBufMas1[16] = "";

    for( unsigned short i = 0; i < strlen( str ) - 1; i++ ) {
        if( ( str[i] == ' ' ) || ( str[i] == ';' ) ) {
            //i -= 1;
        }
        else {
            schetchik++;
            schetchik1++;

            /*char *StrBufMas = new char[schetchik1];
            StrBufMas[schetchik1 - 1] = str[i];*/
            //strcat(StrBufMas1, &str[i]);
            if( ( str[i + 1] == ' ' ) || ( str[i + 1] == ';' ) ) {
                strncpy( StrBufMas1, &str[i - schetchik1 + 1], schetchik1 );
                masKoefic[i - schetchik] = atof( StrBufMas1 );
                //StrBufMas1 = ;
                //delete[schetchik1] StrBufMas;
                schetchik1 = 0;

                for( unsigned char j = 15; j > 0; j-- ) {
                    StrBufMas1[j] = '';
                }
            }
        }
    }

    float *masAll = new float[index - 1 + kolvostrok];
    schetchik = 0;
    schetchik1 = 1;

    for( unsigned short i = 0; i < index - 1 + kolvostrok; i++ ) {
        if( i == ( index + schetchik ) / kolvostrok ) {
            masAll[i] = masOtvet[i - ( i * schetchik1 )];
            schetchik1++;
            schetchik = schetchik + index + kolvostrok;
        }
        else {
            masAll[i] = masKoefic[i];
        }
    }

    float *dev_mas;
    int *dev_index;
    int *dev_kolvoperem;
    cudaMalloc( ( void ** )&dev_index, sizeof( int ) );
    cudaMalloc( ( void ** )&dev_mas, sizeof( float ) );
    cudaMalloc( ( void ** )&dev_kolvoperem, sizeof( int ) );
    cudaMemcpy( dev_index, &index, sizeof( int ), cudaMemcpyHostToDevice );
    cudaMemcpy( dev_mas, &masKoefic, index * sizeof( float ),
                cudaMemcpyHostToDevice );
    cudaMemcpy( dev_kolvoperem, &kolvoperem, sizeof( int ),
                cudaMemcpyHostToDevice );
    vichislenie << <1, kolvoperem >> > ( dev_index, dev_mas, dev_kolvoperem );
    //n = atoi(S.c_str())
    /*float number;
    cout << "Введите число k:  ";
    cin >> number;

    int otvchislo = 1;
    int *dev_otvchislo;
    float *dev_number;

    unsigned short i = 256;
    while (i != 0)
    {
    cudaMalloc((void**)&dev_otvchislo, sizeof(int));
    cudaMalloc((void**)&dev_number, sizeof(float));

    cudaMemcpy(dev_otvchislo, &otvchislo, sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_number, &number, sizeof(float), cudaMemcpyHostToDevice);

    float mas[33792];
    float *dev_mas1;
    randomer(mas);
    cudaMalloc((void**)&dev_mas1, 33792 * sizeof(float));
    cudaMemcpy(dev_mas1, &mas, 33792 * sizeof(float), cudaMemcpyHostToDevice);

    vichislenie << <128, 128 >> > (dev_number, dev_otvchislo, dev_mas1);

    cudaMemcpy(&mas, dev_mas1, 33792 * sizeof(float), cudaMemcpyDeviceToHost);
    cudaMemcpy(&otvchislo, dev_otvchislo, sizeof(int), cudaMemcpyDeviceToHost);

    cudaFree(dev_mas1);
    cudaFree(dev_number);
    cudaFree(dev_otvchislo);

    i -= 1;
    }


    if (otvchislo == 1)
    {
    unsigned char otv[4] = "да";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }
    else
    {
    unsigned char otv[4] = "нет";
    cout << "Число k больше всех чисел в матрице? -" << otv << "n";
    }*/
    system( "pause" );
    return 0;
}

Имеется проблема, связанная с gets(), о которой следует знать: используя gets(), можно перейти границы массива, с которым она вызывалась. Это возможно, поскольку не существует способа указать gets(), где находится граница массива.

#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
struct bd
{
    char *model;
    char *perfomace;
    int price;
};
 
struct format
{ char *resolutions;
  int  freak;
  int memory;
  struct bd notefun;
};
void main (void)
{
    struct format *notebook;
    int i,n,m;
    char s[909];
    printf ("Input size notebooks: ");
    scanf ("%d", &n);
    notebook=(format *)malloc(n*sizeof(format));
    for (i=0; i<n; i++)
    {
        printf ("nInput resolutions: ");
        scanf ("%d", &m);
        getchar ();
        gets (s);
        m=strlen(s);    
        (notebook+i)->resolutions=(char*)malloc(m);
        strcpy((notebook+i)->resolutions,s);
        printf ("nInput freak: ");
        scanf ("%d", &(notebook+i)->freak);
        printf ("nInput memory: ");
        scanf ("%d", &(notebook+i)->memory);
        printf ("nInput data notebook:");
        printf ("n   model:");
        getchar();
        gets (s);
        m=strlen(s);
        (notebook+i)->notefun.model=(char*)malloc(m+1);
        strcpy((notebook+i)->notefun.model,s);
        printf ("n   perfomace:");
        getchar();
        gets (s);
        m=strlen(s);
        (notebook+i)->notefun.perfomace=(char*)malloc(m+1);
        strcpy((notebook+i)->notefun.perfomace,s);
        printf ("n   price:");
        scanf ("%d", &(notebook+i)->notefun.price);
    }
    for (i=0; i<n; i++)
    {
        printf ("%s %d %d %s %s %d", i+1, (notebook+i)->resolutions,(notebook+i)->freak, (notebook+i)->memory, (notebook+i)->notefun.model,
            (notebook+i)->notefun.perfomace, (notebook+i)->notefun.price);
    }
    }

  • описание проблемы
  • Дополнение связанных точек знаний:

описание проблемы

При вызове функции вторичный указатель используется в качестве параметра функции и передается массив строковых указателей, но при доступе возникает ошибка времени выполнения, которая конкретно выражается как «ошибка 0xCCCCCCCC при чтении символов строки».
这里写图片描述
Первая реакция заключается в том, что строка забыла инициализировать, но как только проверка окажется неправильной, я инициализировал ее. Как может возникнуть такая проблема, а затем с помощью одноэтапной отладки было обнаружено, что массив указателей, на который указывает вторичный указатель, передающий значение, находится за пределами границ. Фрагмент кода выглядит следующим образом:

while ((string = *strings++) != NULL) {

        while (*string != '')  {
            if (* string ++ == ‘a’) // Место ошибки, здесь string = 0xcccccccc, Ошибка при чтении строковых символов
                ...
        }
    }

VS считает, что элемент указателя строки за пределами границ неинициализирован, поэтому он выполнит инициализацию по умолчанию.*strings++ Когда цикл оценивается, содержимое элемента вне границ0xccccccccВместо тогоNULL , Таким образом, суждение недействительно, и осуществляется доступ к недоступной памяти.

Тогда при оценке граница массива должна быть ограничена количеством элементов массива, а неNULL ценность.

Дополнение связанных точек знаний

0xcccccccc : Used by Microsoft’s C++ debugging runtime library to mark uninitialised stack memory
0xcdcdcdcd : Used by Microsoft’s C++ debugging runtime library to mark uninitialised heap memory
0xfeeefeee : Used by Microsoft’s HeapFree() to mark freed heap memory

Для 0xcccccccc и 0xcdcdcdcd в режиме отладки VC заполнит все указатели в неинициализированной памяти стека значением 0xcccccccc, когда строка выглядит как «hot, hot …». Все указатели в неинициализированной памяти кучи будут заполнены 0xcdcdcdcd, когда строка будет выглядеть как «tuntuntuntun …».

Так почему отладчик это делает? Версия VC для DEBUG автоматически инициализирует неинициализированный указатель на0xccccccccили0xcdcdcdcd, Вместо того, чтобы просто позволить использовать случайное значение, то есть для облегчения нашей отладки программы. Если начальное значение дикого указателя не определено, то каждый раз при отладке одной и той же программы могут появляться разные результаты. Например, эта программа вылетает в следующий раз. Но он может работать нормально, что, очевидно, очень неблагоприятно для нас, чтобы исправить ошибку, поэтому цель автоматической инициализации — дать нам возможность сразу подтвердить, что мы используем неинициализированный дикий указатель (на самом деле, я все еще думаю, что инициализацияNULLОтносительно доволен).

Для 0xfeeefeee он используется для отметки памяти, которая была освобождена в куче. Обратите внимание, что если память, на которую указывает указатель, освобождается, адрес самой переменной по-прежнему остается адресом ранее указанной памяти, если он не был изменен. Если указатель является указателем на класс, а класс содержит переменную-указатель, после освобождения памяти (для классов C ++ обычно выполняется операция удаления) переменной-указателю в классе будет присвоено значение 0xfeeefeee. Если вы обнаружите, что в процессе отладки кода есть указатель со значением 0xfeeefeee, это означает, что соответствующая память была освобождена и в нашем коде возникла проблема.

Это специфичный для VS механизм, и указатели могут быть инициализированы значением NULL в других компиляторах.

Эти ошибки выдаются при чтении имени файла из параметра.

«невозможно прочитать память» «ошибка чтения символов строки»

Если строка определена как введенный пользователем текст или как жесткая клавиша, то она работает нормально. Но, если часть имени файла читается из файла, соединяется и затем передается через параметр, эти ошибки выдаются.

Я пробовал как с, так и без .c_str()
После удаления некоторых пустых мест в текстовом файле, это теперь работает в Windows, но не в Linux?

        void batch_helper()
{

//batch
vector <string> field_reports;

ifstream field_report_batch;
field_report_batch.open("OCR_batch.txt");
string line;

while (true) { //fill stack with batches
getline(field_report_batch, line);
if (line.empty() || !field_report_batch || field_report_batch.fail())
break;

field_reports.push_back(line);
}
field_report_batch.close();

for (unsigned int i = 0; i < field_reports.size(); i++) {

parse_file("timesheets_we" + field_reports[i] + "_batch_export.csv"); //this does not work

//parse_file("timesheets_we20121221_batch_export.csv"); //this works

}

}void parse_file(const string timecard_WE)
{

//count records
int timecard_count = 0;
string line;

//test input file
ifstream timecard_test;
timecard_test.open(timecard_WE.c_str());
getline(timecard_test, line); //burn header
while (true){
getline(timecard_test, line); //read in row_n
if (!timecard_test || timecard_test.fail())
break;
timecard_count++;
}
timecard_test.close();
line.clear();
}

Похожая проблема, опубликованная в stackoverflow: Вот, проблема заключалась в скрытом пустом месте или беспорядочном конце строки символа. Я проверил на наличие пробелов, но пока не нашел их.

Я попробую это:

           while (true) {
if (line.back() == 'r' || line.back() == 'n') {
test_log << "pop: " << line.back() << "rn";
line.pop_back();
}
}

полученный файл

20120615

поп:

20120622

поп:

20120629

поп:

20120706

поп:

20120713

поп:

20120720

поп:

20120727

поп:

20120803

поп:

20120810

поп:

20120817

поп:

20120824

поп:

20120831

поп:

20120907

поп:

20120914

поп:

20120921

поп:

20120928

поп:

20121005

поп:

20121012

поп:

20121019

поп:

20121026

поп:

20121102

поп:

20121109

поп:

20121116

поп:

20121123

поп:

20121130

поп:

20121207

поп:

20121214

поп:

20121221

поп:

timesheets_we20120615_batch_export.csv BREAK
timesheets_we20120622_batch_export.csv BREAK
timesheets_we20120629_batch_export.csv BREAK
timesheets_we20120706_batch_export.csv BREAK
timesheets_we20120713_batch_export.csv BREAK
timesheets_we20120720_batch_export.csv BREAK
timesheets_we20120727_batch_export.csv BREAK
timesheets_we20120803_batch_export.csv BREAK
timesheets_we20120810_batch_export.csv BREAK
timesheets_we20120817_batch_export.csv BREAK
timesheets_we20120824_batch_export.csv BREAK
timesheets_we20120831_batch_export.csv BREAK
timesheets_we20120907_batch_export.csv BREAK
timesheets_we20120914_batch_export.csv BREAK
timesheets_we20120921_batch_export.csv BREAK
timesheets_we20120928_batch_export.csv BREAK
timesheets_we20121005_batch_export.csv BREAK
timesheets_we20121012_batch_export.csv BREAK

ПЕРЕРЫВЫ в файле журнала — это конец файловых разрывов.

0

Решение

Решение простое и состоит из двух частей:

ЧАСТЬ I
в текстовом файле, из которого я читаю частичные имена файлов и затем объединяю их в полное имя, после некоторого текста было пустое место. Я открыл файл, «выбрать все», а затем вручную удалил конечные пробелы.

ЧАСТЬ II:
это исправлено пока (верно)

{ if (line.back() == 'r' || line.back() == 'n') line.pop_back();}

комбинированное решение:

while (true) { if (line.back() == 'r' || line.back() == 'n' || line.back() == ' ') line.pop_back();}

0

Другие решения

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка при установлении защищенного соединения windows xp
  • Ошибка при установлении защищенного соединения tor