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

Работа с массивом char - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.97
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 21:54     Работа с массивом char #1
Добрый день.
Объясните, если не сложно, на пальцах в чем ошибка?
C++
1
2
char*my1[]={"first my1","second my1"};
my1[0][0]='E';
Синтаксически все корректно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2010, 21:54     Работа с массивом char
Посмотрите здесь:

Проблема с классом и массивом char-ов. C++
C++ работа с массивом
C++ Работа с массивом char
Помощь с массивом char breed[4] = {'Dog ','Cat ', 'Rat ', 'Mouse '} C++
C++ Работа с массивом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:08     Работа с массивом char #2
1)константную строку нельзя изменять
2)доступ осуществляется как к двумерному массиву
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:20  [ТС]     Работа с массивом char #3
Цитата Сообщение от PointsEqual Посмотреть сообщение
1)константную строку нельзя изменять
А разве так константная строка не меняется?
C++
1
2
char t1[][10]={"first m1","second m1"};
t1[0][0]='E';
Цитата Сообщение от PointsEqual Посмотреть сообщение
2)доступ осуществляется как к двумерному массиву
Объясните, пожалуйста, что вы имеете ввиду?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:32     Работа с массивом char #4
C++
1
2
 char*my1[]={"first my1","second my1"};
    my1[0]="E";
Добавлено через 1 минуту
массив был одномерный у вас, а обращались к нему как к матрице
C++
1
my1[0][0]
Добавлено через 9 минут
st_dent, извиняюсь, это массив а не строка у вас, но все равно, доступ осуществлялся как к матрице,
и вместо ='E' надо ="E"
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:34  [ТС]     Работа с массивом char #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
 char*my1[]={"first my1","second my1"};
    my1[0]="E";
В этом примере первая строка становится "E" вместо исходной "first my1".
А как заменить первую букву исходной строки?
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
08.07.2010, 22:47     Работа с массивом char #6
st_dent,
my1[0]="E";// в двойных кавычках считается строкой, т.е. после Е идет 0-символ...
my1[0]='E';//одиночный символ
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:52     Работа с массивом char #7
Цитата Сообщение от st_dent Посмотреть сообщение
А как заменить первую букву исходной строки?
на с++ так например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main()
{
    std::string mas[]={"first my1","second my1"};
    std::string word=mas[0];
    word[0]='E';
    mas[0]=word;
    std::cout<<mas[0];
 
    return EXIT_SUCCESS;
}
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:55  [ТС]     Работа с массивом char #8
Цитата Сообщение от Mur3ik Посмотреть сообщение
st_dent,
my1[0]="E";// в двойных кавычках считается строкой, т.е. после Е идет 0-символ...
my1[0]='E';//одиночный символ
Mur3ik,
Так-
C++
1
2
char*my1[]={"first my1","second my1"};
    my1[0]='E';
-не удается заменить первую букву исходной строки.
Выдает ошибку:
Ошибка 1 error C2440: =: невозможно преобразовать 'char' в 'char *'
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:03     Работа с массивом char #9
st_dent, вы путаете, my1[0] - это ячейка массива, в ней лежит строка , вы меняете саму строку а не символ в ней

Добавлено через 2 минуты
попробуйте так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main()
{
   char*my1[]={"first my1","second my1"};
    char *p = new char[strlen("first my1")+1];
    strcpy(p,"first my1");
    p[0] = 'E';
    my1[0]=p;
    std::cout<<my1[0];
    return EXIT_SUCCESS;
}
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:04  [ТС]     Работа с массивом char #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
на с++ так например
Спасибо, но хочется разобраться с массивом указателей:
C++
1
char*my1[]={"first my1","second my1"};
Здесь можно поменять 1 букву в первой строке?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:04     Работа с массивом char #11
Цитата Сообщение от st_dent Посмотреть сообщение
Здесь можно поменять 1 букву в первой строке?
пример выше
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:08  [ТС]     Работа с массивом char #12
PointsEqual, Спасибо.
Возвращаясь к первому посту.
В чем там ошибка, а то я понять не могу.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:11     Работа с массивом char #13
у вас массив одномерный,
C++
1
2
char*my1[]={"first my1","second my1"};
а вы обращаетесь как к двумерному
C++
1
my1[0][0]='E';
да еще в добавок заменяете не букву в слове а само слово

сначало надо выделить слово из массива, а потом в нем заменять букву
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
08.07.2010, 23:25     Работа с массивом char #14
PointsEqual, здесь проблема не в этом, вы не правы. В коде топикстартера все действительно синтаксически верно, там одинарные кавычки, как и должно быть. К указателю, кстати говоря, вполне корректно обращаться, как к массиву, поскольку имя массива без квадратных скобок по сути и есть указатель на первый элемент массива

Здесь имеется массив указателей на char. Так как в массиве хранятся указатели на строковые константы, возникнет Access violation в Винде или Segmentation fault в Юникс-подобных системах.
http://ru.wikipedia.org/wiki/%D0%9E%...86%D0%B8%D0%B8

Первый же пример:
C
1
2
char *s = "hello world";
*s = 'H';
Замечаете схожесть?
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:27  [ТС]     Работа с массивом char #15
PointsEqual,
у вас массив одномерный,
а вы обращаетесь как к двумерному
Почему одномерный?
Разве это не массив 2х2:
----------------------------------------------
указатель |куда смотрит указатель
-------------|--------------------------------
указатель№1|смотрит на начало первой строки
указатель№2|смотрит на начало второй строки
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
08.07.2010, 23:30     Работа с массивом char #16
Да, для того, чтобы все корректно работало нужно отдельно выделять память для указателей в массиве с помощью malloc() или оператора new в C++. После этого их можно будет изменять как в самом первом примере st_dent

Добавлено через 38 секунд
st_dent, именно так
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:50  [ТС]     Работа с массивом char #17
Demihalf,
Я правильно понял:
Ошибка в том, что я пытаюсь записать новое значение на место первого элемента массива, который находится в области памяти, доступной только для чтения?
-=ЮрА=-
Заблокирован
Автор FAQ
09.07.2010, 00:01     Работа с массивом char #18
Но єто всего лишь вывод, строка не меняется, привожу просто как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
void main()
{
    char *str[]={"first str","second str"};
    printf("Enter symbol for replacing :\t");
    char chr;scanf("%c",&chr);
    printf("%c%s\r\n",chr,str[0] + 1);
    printf("%s\r\n",str[1]);
}
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 00:07     Работа с массивом char #19
st_dent, да, точно. Чтобы так не происходило можно сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstring>
#include <iostream>
using namespace std;
 
int main() 
{
    const int size = 2;
    const int max_length = 256; // Вместо 256 можно любое число - это максимальная длина одной строки
    char* my1[size];
    for (int i = 0; i < size; i++)
        my1[i] = new char[max_length];
    strncpy(my1[0], "first my1", max_length - 1);
    strncpy(my1[1], "second my1", max_length - 1);
 
    my1[0][0] = 'E';
    cout << my1[0] << endl; //Eirst my1
 
    for (int i = 0; i < size; i++)
        delete my1[i];
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2010, 00:10     Работа с массивом char
Еще ссылки по теме:

проблема с массивом типа CHAR C++
C++ Проверка массива char на равенство с таким же массивом
Работа с массивом символов Char C++

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

Или воспользуйтесь поиском по форуму:
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.07.2010, 00:10     Работа с массивом char #20
ах во оно как, до меня дошло.
Yandex
Объявления
09.07.2010, 00:10     Работа с массивом char
Ответ Создать тему
Опции темы

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