274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
1

Перевод из string в char

03.10.2015, 16:28. Показов 25623. Ответов 15
Метки c++ (Все метки)

Хочу перевести из String в char но что та не получается. ошибка такая: инициализация: невозможно преобразовать "const char *" в "char" и аргумент типа "const char **" несовместим с параметром типа "const char *"

я вывожу из текстового фала текст, и перевожу его в char и вывожу в цикле но не тут то было...

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
#include <stdio.h>
#include <string>
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <cstring>
#include <cctype>
#include <cmath>  
#include <stdlib.h>
#include <fstream>
#include <io.h>
 
#define _CRT_SECURE_NO_WARNINGS
 
using namespace std;
 
int main(){
    setlocale(LC_ALL,"RUS");
 
    string str;
 
    FILE *frus;
    if (!(frus = fopen("C:\\cpp\\grus.txt", "r"))){
        cout << "Не удалось открыть файл.";
    }
    
    while(!feof(frus))
    {
        str = fgetc(frus);
        cout << str;
    }
    
    const char *p1[] = {str.c_str()}; 
    int slen = strlen(p1);
    cout << slen;
 
    for(int i = 0; i < slen; i++)
    {
        cout << p1[i];
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2015, 16:28
Ответы с готовыми решениями:

Перевод из string^ в char
как это можно сделать? System::String^ numbron3= textBox11-&gt;Text; const char*...

Перевод из String в Char
Добрый вечер форум. У меня не получается перевод из string в char, использую sprintf. #define...

Перевод элементов из string в массив char
Я задался целью создать небольшую программу, которая бы открывала текстовый файл, считывала символы...

Перевод из String^ в char*. Русскиме символы
Доброго времени суток. Нужно перевести String^ в char*. Делаю следующим образом: String^...

15
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
03.10.2015, 16:39 2
Вы пытаетесь инициализировать чар массив указателем (const char*), отсюда и такая ошибка.
C++
1
2
3
4
5
6
7
8
const char* p1 = str.c_str();
size_t slen = str.lenght();
cout << slen;
 
for(size_t i = 0; i < slen; i++)
    {
        cout << p1[i];
    }
Добавлено через 2 минуты
ps: к символам строки string можно обращаться так же : cout << str[i];
0
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
03.10.2015, 16:54  [ТС] 3
Цитата Сообщение от Operok Посмотреть сообщение
ps: к символам строки string можно обращаться так же : cout << str[i];
Спасибо ваш пример работает, но мне надо string str (текст из файла) копировать в 0-вой элемент массива типа char str[] = "тут текст из фала";

извиняюсь особо в С++ не шарю тока разбираюсь
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
03.10.2015, 16:59 4
Понятно, тогда ваш код немного поправьте:
C++
1
char const * p1[] = {str.c_str()};
Добавлено через 1 минуту
Поясню, в вашем случае вы создали константный массив из чаров, т.е. const относился к типу char* []. А вам, я так понял, нужен массив из (const char*), поэтому только так.
1
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
03.10.2015, 20:06  [ТС] 5
Цитата Сообщение от Operok Посмотреть сообщение
Поясню, в вашем случае вы создали константный массив из чаров, т.е. const относился к типу char* []. А вам, я так понял, нужен массив из (const char*), поэтому только так.
блин не могу разобраться с этими char... подскажите пожалуйста, я сперва разделил задачу на две подзадачи. Первая это копирует русские символы в один файл, а латинские в другой файл все вроде получилось брал текст из строки //const char str[] = "Gei rfhtd dgfdfgdf ваваываыва ыа ыва"; это у нас статистическая переменная. потом я приступил к первой подзадачи, читаем текст из файла тут и пошла не состыковка, несовместимость с чарами. ошибки выдает.

Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <string>
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <cstring>
#include <cctype>
#include <cmath>  
#include <stdlib.h>
#include <fstream>
#include <io.h>
 
#define _CRT_SECURE_NO_WARNINGS
 
using namespace std;
 
int main(){
    setlocale(LC_ALL,"RUS");
 
    string str;
 
    FILE *grus;
    if (!(grus = fopen("C:\\cpp\\grus.txt", "r"))){
        cout << "Не удалось открыть файл.";
    }
    
    while(!feof(grus))
    {
        str = fgetc(grus);
        cout << str;
    }
 
 
//  char * p1[] = {str.c_str()};
    char const * p1[] = {str.c_str()};
 
    size_t slen = str.length();
 
    ofstream slat ("C:\\cpp\\slat.txt");
    if (!slat){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
 
    ofstream frus ("C:\\cpp\\frus.txt");
    if (!frus){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
    
    //const char str[] = "Gei rfhtd dgfdfgdf ваваываыва ыа ыва";
    //int len = strlen(str);
 
    for(int i = 0; i < slen; i++)
    {
        if(p1[i] >= 'А' && p1[i] <= 'я')
        {
            if(p1[i-1] == ' ') frus << ' ';
            frus << p1[i];
        }
            else if(p1[i] >= 'A' && p1[i] <= 'z')
        {
            if(p1[i-1] == ' ') slat << ' ';
            slat << p1[i];
        }
    }
    slat.close();
    frus.close();
}
0
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
03.10.2015, 20:06  [ТС] 6
Перевод из string в char
0
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
03.10.2015, 20:13 7
У вас указатель на массив, надо так делать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(int i = 0; i < slen; i++)
    {
        if(*p1[i] >= 'А' && *p1[i] <= 'я')
        {
            if(*p1[i-1] == ' ') frus << ' ';
            frus << *p1[i];
        }
            else if(*p1[i] >= 'A' && *p1[i] <= 'z')
        {
            if(*p1[i-1] == ' ') slat << ' ';
            slat << *p1[i];
        }
    }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.10.2015, 20:39 8
Цитата Сообщение от Operok Посмотреть сообщение
C++
1
char const * p1[] = {str.c_str()};
Что это?
Если хочешь скопировать строку символов в массив, то тут либо strcpy/memcpy, либо std::copy.
Предварительно озаботившись о достаточном размере памяти в этом массиве.
0
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
03.10.2015, 20:43  [ТС] 9
Цитата Сообщение от Redzep Посмотреть сообщение
У вас указатель на массив, надо так делать:
возможно и так, но походу строка char const * p1[] = {str.c_str()}; не отрабатывает.
в цикле у меня выводит только одну букву "я"
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.10.2015, 20:54 10
Цитата Сообщение от allukard Посмотреть сообщение
строка char const * p1[] = {str.c_str()}; не отрабатывает.
Она делает ровно то, что должна делать, но, к сожалению, не то, что от нее хотят.
p1 - массив указателей на const char, состоящий из одного элемента.
Т.е. в p1 можно использовать только p1[0]. Других элементов там нет.

Добавлено через 5 минут
C++
1
2
3
4
char* p = new char[str.size()+1]; // выделяем память нужного размера
strcpy(p, str.c_str());
// используешь p[0]...p[str.size()] по своему усмотрению
delete [] p; // подчищаем память
2
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
03.10.2015, 22:14 11
Цитата Сообщение от Tulosba Посмотреть сообщение
Что это?
человеку понадобилось создать массив указателей на const char, инициализировав его одним элементом (указателем из string), я подсказал как это сделать
А вообще, надо понять что нужно сделать, создать "массив" строк, тогда vector<string>, если просто скопировать строку в буфер, то копировать в другую string. Если уж используем STL строки, то зачем эти new char[...]?

Добавлено через 5 минут
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 <string>
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <cstring>
#include <cctype>
#include <cmath>  
#include <stdlib.h>
#include <fstream>
#include <io.h>
 
#define _CRT_SECURE_NO_WARNINGS
 
using namespace std;
 
int main(){
    setlocale(LC_ALL,"RUS");
 
    string str;
 
    FILE *grus;
    if (!(grus = fopen("C:\\cpp\\grus.txt", "r"))){
        cout << "Не удалось открыть файл.";
    }
    
    while(!feof(grus))
    {
        str = fgetc(grus);
        cout << str;
    }
 
    ofstream slat ("C:\\cpp\\slat.txt");
    if (!slat){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
 
    ofstream frus ("C:\\cpp\\frus.txt");
    if (!frus){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
 
    for(int i = 0; i < str.lenght(); i++)
    {
        if(str[i] >= 'А' && str[i] <= 'я')
        {
            if(str[i-1] == ' ') frus << ' ';
            frus << str[i];
        }
            else if(str[i] >= 'A' && str[i] <= 'z')
        {
            if(str[i-1] == ' ') slat << ' ';
            slat << str[i];
        }
    }
    slat.close();
    frus.close();
}
Добавлено через 5 минут
Кликните здесь для просмотра всего текста
Если уж очень хочется поработать с классическим массивом символов:
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
#include <stdio.h>
#include <string>
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <cstring>
#include <cctype>
#include <cmath>  
#include <stdlib.h>
#include <fstream>
#include <io.h>
 
#define _CRT_SECURE_NO_WARNINGS
 
using namespace std;
 
int main(){
    setlocale(LC_ALL,"RUS");
 
    string str;
 
    FILE *grus;
    if (!(grus = fopen("C:\\cpp\\grus.txt", "r"))){
        cout << "Не удалось открыть файл.";
    }
    
    while(!feof(grus))
    {
        str = fgetc(grus);
        cout << str;
    }
 
    ofstream slat ("C:\\cpp\\slat.txt");
    if (!slat){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
 
    ofstream frus ("C:\\cpp\\frus.txt");
    if (!frus){
        cout <<"fout не может быть открыт.\n";
        return 1;
    }
    
    const char *p1 = str.c_str(); 
    int len = str.lenght();
 
    for(int i = 0; i < slen; i++)
    {
        if(p1[i] >= 'А' && p1[i] <= 'я')
        {
            if(p1[i-1] == ' ') frus << ' ';
            frus << p1[i];
        }
            else if(p1[i] >= 'A' && p1[i] <= 'z')
        {
            if(p1[i-1] == ' ') slat << ' ';
            slat << p1[i];
        }
    }
    slat.close();
    frus.close();
}
Только учтите, p1 указывает на ту же строку (массив символов) что и string str и p1 валиден, пока str не меняется
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
03.10.2015, 22:14 12
Цитата Сообщение от Operok Посмотреть сообщение
человеку понадобилось создать массив указателей на const char
Нет. Ему понадобилось совсем другое.
Цитата Сообщение от allukard Посмотреть сообщение
Хочу перевести из String в char
Но он просто запутался. И его начали путать дальше.
Цитата Сообщение от Operok Посмотреть сообщение
то зачем эти new char[...]?
Когда надо скопировать в массив, то нужен массив. А т.к. размер неизвестен на момент компиляции, то приходится использовать new. Или придется задаться максимально возможным размером.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
03.10.2015, 22:21 13

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Когда надо скопировать в массив, то нужен массив...
Вырвали фразу из контекста, я сказал:
Цитата Сообщение от Operok Посмотреть сообщение
...если просто скопировать строку в буфер, то копировать в другую string. Если уж используем STL строки, то зачем эти new char[...]?



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

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Нет. Ему понадобилось совсем другое.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но он просто запутался. И его начали путать дальше.
тут да, виноват, я с наскока не смог разобраться что нужно (нужно ли копировать в буфер, ведь в том примере что, привёл ТС, делается просто посимвольный вывод). А потом ещё
Цитата Сообщение от allukard Посмотреть сообщение
но мне надо string str (текст из файла) копировать в 0-вой элемент массива типа char str[] = "тут текст из фала";

0
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
04.10.2015, 08:23  [ТС] 14
Господа вроде все нормально, но во втором варианте задачи от Operok в цикле for выводится только одна буква "я" а в первом варианте просто набор символов...
и жалуется на функцию lenght()
class "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" не содержит члена "lenght"
lenght: не является членом "std::basic_string<_Elem,_Traits,_Alloc>
я не думал что с типами данных будет так сложно, в php и perl такого нет.

попробую пересоздать проект
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
04.10.2015, 09:33 15
allukard, не было возможности проверить код, опечатался пару раз. В добавок вы неправильно считываете файл, вот рабочий вариант:
Кликните здесь для просмотра всего текста
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
#include <string>
#include <iostream>
#include <locale>
#include <string>
#include <fstream>
 
#define _CRT_SECURE_NO_WARNINGS
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "RUS");
 
    string str;
 
    ifstream grus("C:\\cpp\\grus.txt");
    if (!grus.is_open()) {
        cout << "Не удалось открыть файл.";
    }
    while (!grus.eof())
    {
        getline(grus, str);
        cout << str;
 
        ofstream slat("C:\\cpp\\slat.txt");
        if (!slat) {
            cout << "fout не может быть открыт.\n";
            return 1;
        }
 
        ofstream frus("C:\\cpp\\frus.txt");
        if (!frus) {
            cout << "fout не может быть открыт.\n";
            return 1;
        }
 
        const char *p1 = str.c_str();
        int slen = str.length();
 
        for (int i = 0; i < slen; i++)
        {
            if (p1[i] >= 'А' && p1[i] <= 'я')
            {
                if (p1[i - 1] == ' ') frus << ' ';
                frus << p1[i];
            }
            else if (p1[i] >= 'A' && p1[i] <= 'z')
            {
                if (p1[i - 1] == ' ') slat << ' ';
                slat << p1[i];
            }
        }
        slat.close();
        frus.close();
    }
    grus.close();
    cout << endl;
    system("pause");
}
1
274 / 194 / 61
Регистрация: 08.11.2010
Сообщений: 1,730
04.10.2015, 14:53  [ТС] 16
Цитата Сообщение от Operok Посмотреть сообщение
Operok, Tulosba... и.тд.
Благодарю а помощь.
Действительно надо было сразу в одном цикле делать. буду знать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2015, 14:53
Помогаю со студенческими работами здесь

Строки. Создание, объявление и компановка. Перевод из string в char[]
Здравствуйте! У меня возникла проблема при создании строки. Суть задачи: есть несколько...

Перевод массива char в std::string в определенном формате
Имеится char a=&quot;145&quot;; нужно его превратить в std::string , но чтоб string b=&quot;&quot;; тоесть чтоб...

есть массив char. есть строка string. как присвоить значению string-a значение char-a?
есть массив char. есть строка string. как присвоить значению string-a значение char-a?

Перевод String В Char
Необходимо перевести считаную строку с Edit1 в массив типа char для дальнейший обработки данной...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru