Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
#1

Работа с массивом char

08.07.2010, 21:54. Просмотров 4688. Ответов 32
Метки нет (Все метки)

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

Работа с массивом char
Товарищи подскажите пожалуйста, не могу никак понять в чём проблема. Есть...

Работа с массивом char
Вот задание Вам дана непустая строка, состоящая из строчных латинских букв,...

Работа с массивом символов Char
Народ помогите! 2. Дано целое число N и текстовый файл. Создать строковый...

проблема с массивом типа CHAR
нужно выполнить функцию fopen() . которая кушает на вход указатель на массив...

Проблема с классом и массивом char-ов
Есть класс, содержащий одномерный массив из char-ов и методы для работы с ним....

32
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:08 #2
1)константную строку нельзя изменять
2)доступ осуществляется как к двумерному массиву
0
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:20  [ТС] #3
Цитата Сообщение от PointsEqual Посмотреть сообщение
1)константную строку нельзя изменять
А разве так константная строка не меняется?
C++
1
2
char t1[][10]={"first m1","second m1"};
t1[0][0]='E';
Цитата Сообщение от PointsEqual Посмотреть сообщение
2)доступ осуществляется как к двумерному массиву
Объясните, пожалуйста, что вы имеете ввиду?
0
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:32 #4
C++
1
2
 char*my1[]={"first my1","second my1"};
    my1[0]="E";
Добавлено через 1 минуту
массив был одномерный у вас, а обращались к нему как к матрице
C++
1
my1[0][0]
Добавлено через 9 минут
st_dent, извиняюсь, это массив а не строка у вас, но все равно, доступ осуществлялся как к матрице,
и вместо ='E' надо ="E"
1
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:34  [ТС] #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
C++
1
2
 char*my1[]={"first my1","second my1"};
    my1[0]="E";
В этом примере первая строка становится "E" вместо исходной "first my1".
А как заменить первую букву исходной строки?
0
Mur3ik
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
08.07.2010, 22:47 #6
st_dent,
my1[0]="E";// в двойных кавычках считается строкой, т.е. после Е идет 0-символ...
my1[0]='E';//одиночный символ
0
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 22:52 #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;
}
0
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 22:55  [ТС] #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 *'
0
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:03 #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;
}
1
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:04  [ТС] #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
на с++ так например
Спасибо, но хочется разобраться с массивом указателей:
C++
1
char*my1[]={"first my1","second my1"};
Здесь можно поменять 1 букву в первой строке?
0
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:04 #11
Цитата Сообщение от st_dent Посмотреть сообщение
Здесь можно поменять 1 букву в первой строке?
пример выше
0
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:08  [ТС] #12
PointsEqual, Спасибо.
Возвращаясь к первому посту.
В чем там ошибка, а то я понять не могу.
0
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
08.07.2010, 23:11 #13
у вас массив одномерный,
C++
1
2
char*my1[]={"first my1","second my1"};
а вы обращаетесь как к двумерному
C++
1
my1[0][0]='E';
да еще в добавок заменяете не букву в слове а само слово

сначало надо выделить слово из массива, а потом в нем заменять букву
1
Demihalf
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 354
08.07.2010, 23:25 #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';
Замечаете схожесть?
0
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:27  [ТС] #15
PointsEqual,
у вас массив одномерный,
а вы обращаетесь как к двумерному
Почему одномерный?
Разве это не массив 2х2:
----------------------------------------------
указатель |куда смотрит указатель
-------------|--------------------------------
указатель№1|смотрит на начало первой строки
указатель№2|смотрит на начало второй строки
0
Demihalf
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 354
08.07.2010, 23:30 #16
Да, для того, чтобы все корректно работало нужно отдельно выделять память для указателей в массиве с помощью malloc() или оператора new в C++. После этого их можно будет изменять как в самом первом примере st_dent

Добавлено через 38 секунд
st_dent, именно так
1
st_dent
64 / 64 / 12
Регистрация: 05.07.2010
Сообщений: 219
08.07.2010, 23:50  [ТС] #17
Demihalf,
Я правильно понял:
Ошибка в том, что я пытаюсь записать новое значение на место первого элемента массива, который находится в области памяти, доступной только для чтения?
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.07.2010, 00:01 #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]);
}
1
Demihalf
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 354
09.07.2010, 00:07 #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;
}
2
PointsEqual
ниначмуроФ
839 / 523 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
09.07.2010, 00:10 #20
ах во оно как, до меня дошло.
0
09.07.2010, 00:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2010, 00:10

Задание с массивом типа char
Нужно удалить все столбцы в которых есть хотя бы одна буква 'а'.Ошибка в...

Работа со строками - Invalid conversion from 'char' to 'const char*'
#include &lt;iostream&gt; #include &lt;ctype.h&gt; #include &lt;stdio.h&gt; #include...

Проверка массива char на равенство с таким же массивом
#include &lt;iostream&gt; using namespace std; int main() { char chArr={&quot;4 8&quot;};...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru