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

Переполнение буфера . Что делать ? - C++

Восстановить пароль Регистрация
 
ack_c4
0 / 0 / 0
Регистрация: 13.01.2014
Сообщений: 4
16.05.2014, 04:37     Переполнение буфера . Что делать ? #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
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
 
int main()
{
    char   in[80];          /* строка ввода */
    char   res1[80];        /* строка результата 1 */
    char   res2[80];        /* строка результата 2 */
    char*  cur;             /* ссылка на подстроку */
    char   modIn[80];       /* модиф. строка ввода */
    char   word[80];        /* строка слова */
    int    len, rc, i, n;
    int    lenIn;           /* длина строки ввода */
    int    lenCur;          /* длина подстроки */
    int    numW;            /* число слов в строке */
 
 
    printf("Input string; ended symbol '#' \r\n");
 
    /* Ввод исходной строки;
    между словами любое число пробелов;
    могут быть начальные и концевые пробелы;
    перед нажатием Enter ввести символ '#'
    */
    rc = scanf_s("%[^#]", in);            // строку вводим до символа '#'
    if (rc == -1)
    {
        printf("Error: input data\r\n");
        return 1;
    }
    printf("in = %s\r\n", in);
    lenIn = strlen(in);
 
    /* Модификация строки ввода;
    между словами будет только ОДИН пробел;
    начальные и концевые пробелы убраны;
    подсчитано число слов
    */
    cur = in;
    modIn[0] = '\0';
    lenCur = 0;
    numW = 0;
 
    while (lenCur != lenIn)
    {
        len = strspn(cur, " ");
        lenCur += len;
        cur += len;
        if (lenCur < lenIn)
        {
            numW++;
            len = strcspn(cur, " ");
            memcpy(word, cur, len);
            word[len] = ' ';
            word[len + 1] = '\0';
            strcat_s(modIn, word);
            lenCur += len;
            cur = cur + len;
        }
    }
    len = strlen(modIn);
    modIn[len - 1] = '\0';        // убрали последний пробел
    printf("modIn = %s\r\n", modIn);
 
    /* Разбиение входной строки на 2 подстроки */
    cur = modIn;
    n = numW / 2;
    for (i = 0; i < n; i++)
    {
        cur = strchr(cur, ' ');
        cur++;                    // сдвинулись с пробела
    }
    cur[-1] = '\0';
    res1[0] = '\0';
    strcat_s(res1, modIn);
    res2[0] = '\0';
    strcat_s(res2, cur);
    printf("res1 = %s\r\n", res1);
    printf("res2 = %s\r\n", res2);
 
    printf("Ending, not errors");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 04:37     Переполнение буфера . Что делать ?
Посмотрите здесь:

C++ переполнение буфера
C++ Переполнение буфера
C++ Переполнение буфера! (наверное)
C++ Переполнение буфера
C++ Переполнение буфера
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,478
16.05.2014, 11:46     Переполнение буфера . Что делать ? #2
Что и где переполняется?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
16.05.2014, 12:58     Переполнение буфера . Что делать ? #3
Раз основной вопрос уже задан, то пришло время вангования!
Цитата Сообщение от ack_c4 Посмотреть сообщение
Переполнение буфера . Что делать ?
Увеличивать буфер, или искать какой-нибудь безвыходный цикл, или еще какую ошибку. Точнее наоборот.
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
16.05.2014, 13:15     Переполнение буфера . Что делать ? #4
Смысл этого кода постичь не в состоянии, но у вас очевидная логическая ошибка в (бесконечном) цикле while
Кликните здесь для просмотра всего текста
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
#define BUF_SIZE              (80)
 
int main(int argc,char** argv)
{                                      
   char     pIn  [BUF_SIZE + 1];       // строка ввода
   char     res1 [BUF_SIZE + 1];       // строка результата 1
   char     res2 [BUF_SIZE + 1];       // строка результата 2
   char     modIn[BUF_SIZE + 1];       // модиф. строка ввода
   char     word [BUF_SIZE + 1];       // строка слова
 
   printf("Input string; ended symbol '#'\r\n");
 
   // Ввод исходной строки;
   // между словами любое число пробелов;
   // могут быть начальные и концевые пробелы;
   // перед нажатием Enter ввести символ '#'
   int   rc = scanf("%[^#]",pIn);            // строку вводим до символа '#'
 
   if (rc == -1)
   {  
      printf("Error: input data\r\n");
      return 1;
   }
 
   printf("in = %s\r\n",pIn);
   
   int   lenIn = strlen(pIn);
 
   // Модификация строки ввода;
   // между словами будет только ОДИН пробел;
   // начальные и концевые пробелы убраны;
   // подсчитано число слов
   char*    pCur = pIn;
 
   int   lenCur = 0;
   int   numW   = 0;
 
   *modIn = 0;
 
   int   len = 0;
 
   while (lenCur < lenIn)
   {  
      len = strspn(pCur," ");
 
      lenCur += len;
      pCur   += len;
      
      if (lenCur < lenIn)
      {  
         ++numW;
 
         len = strcspn(pCur," ");
         
         memcpy(word,pCur,len);
 
         word[len] = ' ';
         word[len + 1] = 0;
 
         strcat(modIn,word);
         
         lenCur += len;
         pCur   += len;
      }
   }
 
   len = strlen(modIn);
   
   modIn[len - 1] = 0;        // убрали последний пробел
 
   printf("modIn = %s\r\n",modIn);
 
   // Разбиение входной строки на 2 подстроки
   pCur = modIn;
 
   int   nn = numW / 2;
   
   for (int ii = 0; ii < nn; ++ii)
   {
       pCur = strchr(pCur,' ');
       ++pCur;                    // сдвинулись с пробела
   }
 
   pCur [-1] = 0;
   res1[0]   = 0;
 
   strcat(res1,modIn);
 
   res2[0] = 0;
 
   strcat(res2,pCur);
   
   printf("res1 = %s\r\n",res1);
   printf("res2 = %s\r\n",res2);
 
   printf("Ending, not errors");
 
   return 0;
}
Миниатюры
Переполнение буфера . Что делать ?  
Yandex
Объявления
16.05.2014, 13:15     Переполнение буфера . Что делать ?
Ответ Создать тему
Опции темы

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