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

Указатели и действия над указателями - C++

Восстановить пароль Регистрация
 
gekas
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 70
20.05.2014, 20:05     Указатели и действия над указателями #1
C++
1
2
3
4
5
char *ptr, result[250], s1[250];
 
ptr = strtok(s1, " ");
 
if (strstr(result, strcpy(" ", strcpy(ptr, " "))) == NULL) strcat_s(result, strcpy(ptr, " "));
Программа слетает на участке с проверкой условия. Подскажите, почему и как исправить?
Миниатюры
Указатели и действия над указателями  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2014, 20:05     Указатели и действия над указателями
Посмотрите здесь:

C++ Действия над матрицами
действия над матрицами C++
C++ Действия над матрицами
Действия над массивами C++
Указатели. Работа с указателями C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.05.2014, 20:13     Указатели и действия над указателями #2
Цитата Сообщение от gekas Посмотреть сообщение
почему
потому что первый параметр strcpy никак не может быть строковым литералом
Цитата Сообщение от gekas Посмотреть сообщение
C++
1
strcpy(" ", strcpy(ptr, " "))
Цитата Сообщение от gekas Посмотреть сообщение
и как исправить?
зависит от того что вы делаете и что вам надо
nmcf
4299 / 3720 / 1253
Регистрация: 14.04.2014
Сообщений: 14,551
20.05.2014, 20:14     Указатели и действия над указателями #3
s1 инициализирована?
Первый параметр strcpy() не может быть константой.
gekas
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 70
20.05.2014, 20:19  [ТС]     Указатели и действия над указателями #4
Надо найти в строке result все слова (группа символов, разделенная пробелом), равные слову, на которое указывает текущий ptr. Если такие слова не найдены, то добавить в строку result строку, на который указывает ptr.
То есть искать надо ptr с пробелами с обоих сторон.
Цитата Сообщение от Jupiter Посмотреть сообщение
strcpy никак не может быть строковым литералом
как тогда "обернуть" str в пробелы для поиска этой подстроки в строке s1?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.05.2014, 20:22     Указатели и действия над указателями #5
Цитата Сообщение от gekas Посмотреть сообщение
Надо найти в строке result все слова (группа символов, разделенная пробелом), равные слову, на которое указывает текущий ptr. Если такие слова не найдены, то добавить в строку result строку, на который указывает ptr.
То есть искать надо ptr с пробелами с обоих сторон.
перед тем как "поганить" строку strtok-ом нужно её скопировать, и осуществлять поиск в копии
Цитата Сообщение от gekas Посмотреть сообщение
как тогда "обернуть" str в пробелы?
Strtok противоположность
gekas
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 70
20.05.2014, 20:35  [ТС]     Указатели и действия над указателями #6
Цитата Сообщение от nmcf Посмотреть сообщение
s1 инициализирована?
Инициализирована:
C++
1
2
3
4
for (int i = 0; i < size; i++)
        s1[i] = '\0';               // Зполняем строку нуль-символом
    
    cin.getline(s1, size);
Кликните здесь для просмотра всего текста
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
#include <cctype>
#include <cstring>
#include <string>
#include "conio.h"
#include "stdio.h"
#include <cstdio>
#define size 250
 
using namespace std;
 
void showStr(char* str){
    cout << "Строка:";
    for (int i = 0; i < size; i++) cout << str[i];
    cout << endl;
}
 
void checkStr(char * str){
    for (int i = 0; i < size; i++){
        if ((str[i] == ' ') && (str[i + 1] == ' ')) for (int j = i; j < size; j++) str[j] = str[j + 1];
    }
}
 
void main() {
    setlocale(LC_ALL, "Russian");
    char s1[size], result[size], *ptr, *resPtr;
 
 
 
    for (int i = 0; i < size; i++){
        s1[i] = '\0';               // Заполняем строку нуль-символом
        result[i] = '\0';
    }
    result[0] = ' ';
    cin.getline(s1, size);
    checkStr(s1);                   //Убираем пробелы, которые идут подряд
    while (s1[lengthStr] != '\0') lengthStr++;  //Ищем индекс последнего символа строки
 
    if (lengthStr == -1){
        cout << "Строка пустая!" << endl;
        system("Pause");
        exit;
    }
    
 
    ptr = strtok(s1, " ");
    
while (ptr!=NULL){
        
    if (strstr(result, strcpy(" ", strcpy(ptr, " "))) == NULL) strcat_s(result, strcpy(ptr, " "));  // ***
    
        ptr = strtok(NULL, " ");
    }
 
showStr(result);
    system("Pause");
}


Добавлено через 5 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
перед тем как "поганить" строку strtok-ом нужно её скопировать, и осуществлять поиск в копии
Поиск не в s1, а в строке result, которую мы не "поганим" strtok'om

Кликните здесь для просмотра всего текста
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
#include <cctype>
#include <cstring>
#include <string>
#include "conio.h"
#include "stdio.h"
#include <cstdio>
#define size 250
 
using namespace std;
 
void showStr(char* str){
    cout << "Строка:";
    for (int i = 0; i < size; i++) cout << str[i];
    cout << endl;
}
 
void checkStr(char * str){
    for (int i = 0; i < size; i++){
        if ((str[i] == ' ') && (str[i + 1] == ' ')) for (int j = i; j < size; j++) str[j] = str[j + 1];
    }
}
 
void main() {
    setlocale(LC_ALL, "Russian");
    char s1[size], result[size], *ptr, *resPtr;
 
 
 
    for (int i = 0; i < size; i++){
        s1[i] = '\0';               // Заполняем строку нуль-символом
        result[i] = '\0';
    }
    result[0] = ' ';
    cin.getline(s1, size);
    checkStr(s1);                   //Убираем пробелы, которые идут подряд
    while (s1[lengthStr] != '\0') lengthStr++;  //Ищем индекс последнего символа строки
 
    if (lengthStr == -1){
        cout << "Строка пустая!" << endl;
        system("Pause");
        exit;
    }
    
 
    ptr = strtok(s1, " ");
    
while (ptr!=NULL){
        
    if (strstr(result, strcpy(" ", strcpy(ptr, " "))) == NULL) strcat_s(result, strcpy(ptr, " "));  // ***
    
        ptr = strtok(NULL, " ");
    }
 
showStr(result);
    system("Pause");
}


Добавлено через 6 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
Сообщение от gekas
как тогда "обернуть" str в пробелы?
Strtok противоположность
Можете продемонстрировать использование sprintf на конкретном примере (обернуть ptr в пробелы)? Буду очень признателен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 20:39     Указатели и действия над указателями
Еще ссылки по теме:

Прога написана с указателями,как указатели заменить ссылками C++
Операции над указателями C++
арифметические действия с указателями не работают C++

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.05.2014, 20:39     Указатели и действия над указателями #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
char buf[100];
sprintf(buf, " %s ", ptr);
с защитой от переполнения:
C++
1
snprintf(buf, 100, " %s ", ptr);
Yandex
Объявления
20.05.2014, 20:39     Указатели и действия над указателями
Ответ Создать тему
Опции темы

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