Как изменить массив char c

char* foo = (char*) malloc(sizeof(char)*50); foo = "testing"; In C, i can see the first character of that string : printf("%c",foo[0]); But when i try to change that value : foo[0]='f' It gives
char* foo = (char*) malloc(sizeof(char)*50); foo = "testing";

In C, i can see the first character of that string :

printf("%c",foo[0]);

But when i try to change that value :

foo[0]='f'

It gives error in runtime.

How can i change this, dynamically allocated, char array’s values?

Tim Cooper's user avatar

Tim Cooper

156k38 gold badges325 silver badges276 bronze badges

asked May 14, 2011 at 16:15

platypus's user avatar

You are setting foo to point to the string literal ("testing") not the memory you allocated. Thus you are trying to change the read only memory of the constant, not the allocated memory.

This is the correct code:

char* foo = malloc(sizeof(char)*50);
strcpy(foo,"testing");

or even better

cont int MAXSTRSIZE = 50;
char* foo = malloc(sizeof(char)*MAXSTRSIZE);
strncpy(foo,"testing",MAXSTRSIZE);

to protect against buffer over-run vulnerability.

answered May 14, 2011 at 16:17

Hogan's user avatar

HoganHogan

68.6k10 gold badges78 silver badges116 bronze badges

1

Your problem is that you are changing the pointer reference.

By doing :

char* foo = (char*) malloc(sizeof(char)*50); foo = "testing";

You are assigning the foo pointer to the "testing" string that is stored somewhere (hens the runtime error i guess), not to the newly allocated space.

Hope this will help

answered May 14, 2011 at 16:20

sitifensys's user avatar

sitifensyssitifensys

2,02416 silver badges29 bronze badges

With strings, you shouldn’t assign their values via the assignment operator (=). This is because strings aren’t an actual type, they are just char pointers. Instead, you have to use strcpy.

The problem with your code is that you have allocated memory for foo, then you reassign foo to a different memory address that is READONLY. When you assign to foo[0] you get a runtime error because you are trying to write to readonly memory.

Fix your code by doing this:

char* foo = malloc(50);
strcpy(foo, "testing");

This works because foo points to the address that you allocated.

answered May 14, 2011 at 16:18

Marlon's user avatar

MarlonMarlon

19.7k11 gold badges67 silver badges100 bronze badges

3

1.

name="Messi";

You can´t assign a char array with a string unless at its initialization, which is done with:

char name[]="Ronaldo";

Rather use strcpy() (Header string.h) -> strcpy(name,"Messi"); instead.

Consider that the array name needs to be capable of holding the new-assigned string + the null terminator, which is in this case provided because the string "Ronaldo" has more characters than any of the following. If that would not be the case you have to define name with an appropriate amount of characters or choose a name which is bigger than anyone else or the program would cause an overflow of data in memory.

2.

Note that the switch statement doesn´t make sense if choice is always 0 because you have never read input for choice.

Also the cases to the switch are not enclosed by { and } which should give you a compilation error.

3.

choice is initialized by a character. While this is permissible, it does not make sense in this case and confuses readers of your code. Rather use int choice = 0;


Corrected code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
   char name[]="Ronaldo";
    int choice=0;

    printf("Select Playern");
    printf("1.Messin2.Suarezn3.Neymarn4.Dembelen5.Mullernn");

    scanf("%d",&choice);

    switch(choice)
    {

    case 1:
            printf("nMessi is Selected");
            strcpy(name,"Messi");

            break;


    case 2:
            printf("nSuarez is Selected");
            strcpy(name,"Suarez");

            break;


    case 3:
            printf("nNeymar is Selected");
            strcpy(name,"Neymar");

            break;    

    case 4:
            printf("nDembele is Selected");
            strcpy(name,"Dembele");

            break;    


    case 5:
            printf("nMuller is Selected");
            strcpy(name,"Muller"); 
           
            break;               

    default:
            printf("Exit");
            exit(1);
    } 

    printf("nPlayer changed to %s",name);   
    return 0;
}

Output:

/a.out
Select Player  
1.Messi      
2.Suarez      
3.Neymar             
4.Dembele 
5.Muller 
  
2        // Input from User

Suarez is Selected               
Player changed to Suarez      

1.

name="Messi";

You can´t assign a char array with a string unless at its initialization, which is done with:

char name[]="Ronaldo";

Rather use strcpy() (Header string.h) -> strcpy(name,"Messi"); instead.

Consider that the array name needs to be capable of holding the new-assigned string + the null terminator, which is in this case provided because the string "Ronaldo" has more characters than any of the following. If that would not be the case you have to define name with an appropriate amount of characters or choose a name which is bigger than anyone else or the program would cause an overflow of data in memory.

2.

Note that the switch statement doesn´t make sense if choice is always 0 because you have never read input for choice.

Also the cases to the switch are not enclosed by { and } which should give you a compilation error.

3.

choice is initialized by a character. While this is permissible, it does not make sense in this case and confuses readers of your code. Rather use int choice = 0;


Corrected code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
   char name[]="Ronaldo";
    int choice=0;

    printf("Select Playern");
    printf("1.Messin2.Suarezn3.Neymarn4.Dembelen5.Mullernn");

    scanf("%d",&choice);

    switch(choice)
    {

    case 1:
            printf("nMessi is Selected");
            strcpy(name,"Messi");

            break;


    case 2:
            printf("nSuarez is Selected");
            strcpy(name,"Suarez");

            break;


    case 3:
            printf("nNeymar is Selected");
            strcpy(name,"Neymar");

            break;    

    case 4:
            printf("nDembele is Selected");
            strcpy(name,"Dembele");

            break;    


    case 5:
            printf("nMuller is Selected");
            strcpy(name,"Muller"); 
           
            break;               

    default:
            printf("Exit");
            exit(1);
    } 

    printf("nPlayer changed to %s",name);   
    return 0;
}

Output:

/a.out
Select Player  
1.Messi      
2.Suarez      
3.Neymar             
4.Dembele 
5.Muller 
  
2        // Input from User

Suarez is Selected               
Player changed to Suarez      

45 / 45 / 40

Регистрация: 31.08.2015

Сообщений: 147

1

30.06.2016, 22:47. Показов 3522. Ответов 4


Есть два элемента массива типа char(не по одному символу), нужно поменять их местами. Как это возможно сделать?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Morphiya

0 / 0 / 0

Регистрация: 30.06.2016

Сообщений: 7

30.06.2016, 23:58

2

Поменять элементы в одном массиве?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main (void)
{
    char array[] = {'a', 'b', 'c', 'd', 'e'};
    printf ("array = %sn", array);
 
    // определяем длинну массива
    size_t size = sizeof(array) / sizeof(*array);
 
    // создаем временный "стакан" для замены и меняем местами 0 и 3 элементы
    char temp = array[size+1];
    temp = array[0];
    array[0] = array[3];
    array[3] = temp;
 
    printf ("new array = %sn", array);
 
    return 0;
}



0



45 / 45 / 40

Регистрация: 31.08.2015

Сообщений: 147

01.07.2016, 00:17

 [ТС]

3

Мне нужно поменять местами целые строки то есть например есть массив x[n][10] мне надо поменять местами строки x[1] и x[2]



0



easybudda

Модератор

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

11660 / 7173 / 1704

Регистрация: 25.07.2009

Сообщений: 13,142

01.07.2016, 00:39

4

Лучший ответ Сообщение было отмечено IVAN1234 как решение

Решение

Самый дурацкий способ:

C
1
2
3
4
5
6
int i;
for ( i = 0; i < 10; ++i ) {
    char tmp = x[1][i];
    x[1][i] = x[2][i];
    x[2][i] = tmp;
}

Выпендрёжный способ

C
1
2
3
4
5
#include <string.h>
char buf[10];
memcpy(buf, x[1], 10);
memcpy(x[1], x[2], 10);
memcpy(x[2], buf, 10);

Быстрый

C
1
2
3
4
5
6
7
8
9
10
11
12
#define ROWS (5) /* или сколько строк нужно */
#define COLUMNS (10)
/*...*/
char x[ROWS * COLUMNS];
char * px[ROWS];
int i;
for ( i = 0; i < ROWS; ++i )
    px[i] = x + i * COLUMNS;
/*...*/
char * tmp = px[1];
px[1] = px[2];
px[2] = tmp;



2



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

33880 / 18907 / 3981

Регистрация: 12.02.2012

Сообщений: 31,705

Записей в блоге: 13

02.07.2016, 19:35

5

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, char *argv[])
{
 
  char x,y;
  
  x='a';
  y='b';
  
  printf("%c %cn",x,y);
  
  x=x^y;
  y=x^y;
  x=x^y;
  
  printf("%c %cn",x,y);
  
  system("PAUSE");  
  return 0;
}



1



У меня есть этот заголовок:

MvProjectQueue & operator >> (char *);

И я должен написать функцию, отвечающую этой спецификации. (моя функция должна «вернуть» массив символов, используя >> оператор)

Я должен изменить переданный аргумент, то есть, когда вызывается моя функция, я получаю массив char и мне нужно изменить его (на месте).

Обычно я бы использовал

MvProjectQueue & operator >> (char **);

получил указатель на char * и я бы решил это легко, используя что-то вроде этого:

#include <iostream>

using namespace std;

class SimpleShowcaseObject
{
public:
SimpleShowcaseObject(){};
~SimpleShowcaseObject(){};

SimpleShowcaseObject & operator >> (char ** p_ch)
{
*p_ch = "changed";
cout << "in scope: " << *p_ch << endl;

return *this;
}
};

int main(void)
{
char *ch = new char[10];

ch = "hello";
SimpleShowcaseObject o = SimpleShowcaseObject();

cout << "original: " << ch << endl;
o >> &ch;
cout <<"changed: " << ch << endl;

delete[] ch;

cin.get();
return 0;
}

Но это:

#include <iostream>

using namespace std;

class SimpleShowcaseObject
{
public:
SimpleShowcaseObject(){};
~SimpleShowcaseObject(){};

SimpleShowcaseObject & operator >> (char *ch)
{
ch = "changed";
cout << "in scope: " << ch << endl;

return *this;
}
};

int main(void)
{
char *ch = new char[10];

ch = "hello";
SimpleShowcaseObject o = SimpleShowcaseObject();

cout << "original: " << ch << endl;
o >> ch;
cout <<"changed: " << ch << endl;

delete[] ch;

cin.get();
return 0;
}

выполняет и печатает:

original: hello
in scope: changed
changed: hello

и я хотел бы иметь

original: hello
in scope: changed
changed: changed

(отредактировано несколько раз, большое спасибо всем за попытку помочь!)

-4

Решение

Ваша функция получает то, что должно быть буфером, в который вы можете записать:

SimpleShowcaseObject & operator >> (char *ch)
{
//ch = "changed";// with this you are changing the value of the pointer, not what you want
strcpy (ch, "changed");
cout << "in scope: " << ch << endl;

return *this;
}

Как уже отмечали другие, это не очень хороший дизайн: ваш operator >> должен написать строку (char[]) в буфере, не зная длины входного буфера; не хороший сценарий.

0

Другие решения

Других решений пока нет …

Хорошо, у меня есть структура

typedef struct contact {

    char firstName[32];
    char lastName[32];
    char address[100];
    char city[32];
    char state[32];
    char zipcode[10];

} Contact;

И мне нужно сделать значение firstName равным «Herp»
Я пробовал что-то вроде этого:

int main(void) { 
    Contact contact;
    contact.firstName = "Herp"; // I also tried the following line of code:
    contact.firstName[] = "Herp"; // This doesn't work, and when I add a 0 to where the array needs to point, I get a syntax error.
}

Любая помощь будет большим.

4 ответы

Ваша структура отведет 32 байта памяти для .firstName для каждого экземпляра, а также для другого char[] полей.

Компания char[32] буфер может быть прочитан, как будто это char* указательная переменная, но если вы напишете contact.firstName = "Herp" это как если бы вы пытались переназначить адрес памяти поля. Однако вы не можете этого сделать — адрес этого буфера фиксирован относительно начала всей структуры в памяти.

Следовательно, вы должны копия нужные данные из исходной строки в буфер.

В ограниченных случаях вы можете использовать strcpy для этого, но в идеале вы должны использовать strncpy вместо этого убедитесь, что вы не можете переполниться из одного поля в другое.

Остерегайтесь возможности того, что результирующий буфер не будет иметь конечного NUL в нем, если исходная строка имела длину 32+ символа.

ответ дан 14 окт ’13, 18:10

Я проголосовал за ответ noelicus, но я чувствую, что нужно пойти немного дальше.

typedef struct contact {

    char* firstName;
    char* lastName;
    char* address;
    char* city;
    char* state;
    char* zipcode;

} Contact;

Тогда это сработает:

contact.firstName = "Herp";

Причина в том, что указатель будет установлен так, чтобы указывать на выделенное пространство, содержащее строку.

В вашем случае строка уже выделена, и вам нужно скопировать постоянную строку (строки C неизменяемы). Я бы сказал, что лучший способ сделать это:

strncpy(contact.firstName, "Herp", sizeof(contact.firstName));

Эта форма защитит от возможного переполнения стека. Вы никогда не сможете скопировать в целевую строку больше байтов, чем она может вместить.

ответ дан 14 окт ’13, 18:10

strcpy(contact.firstName,"Herp");

Вам нужно копия строку в массив символов (строку).

Использование квадратных скобок позволит получить доступ к символу в строке, например contact.firstName[0] для доступа к первому символу.

Редактировать:
strcpy это хорошее место для начала и изучения строк, но в реальной системе это небезопасно, так как он не будет проверять, есть ли место в буфере, в который вы копируете. Если вы хотите узнать больше о безопасной обработке строк, попробуйте strcpy_s и т.д. — чтобы быть в безопасности, функциям необходимо указать максимальный размер массива/строки, например, с помощью Макрос РАЗМЕР МАССИВА.

ответ дан 23 мая ’17, 12:05

Если вы хотите избежать переполнения буфера

strncpy(contact.firstName,"Herp",32);

Убедитесь, что значение, которое вы передаете как «Herp», не может содержать более 31 символа, как объяснил Alnitak :)

ответ дан 14 окт ’13, 18:10

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

c

or задайте свой вопрос.

28.12.2019C Программы, Массивы

В этой статье объясняется, как установить или изменить значение массива unsigned char во время выполнения в C.

Данный:
Предположим, у нас есть массив без знака размера n

unsigned char arr[n] = {};

// currently arr = {'', '', '', ...}

Сделать:
Мы хотим установить или изменить значения этого массива во время выполнения.

Например, мы хотим сделать массив

arr = {'1', '2', '3', ...}

Решение:
Это может быть достигнуто с помощью метода memcpy () . memcpy () используется для копирования блока памяти из одного места в другое. Он объявлен в string.h

Синтаксис:

// Copies "numBytes" bytes from address "from" to address "to"
void * memcpy(void *to, const void *from, size_t numBytes);

Ниже приведена реализация вышеуказанной программы:

  
#include <stdio.h>
#include <string.h>

int main()

{

    unsigned char arr[3] = { 0 };

    printf("Initial unsigned char array:n");

    for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {

        printf("%c ", arr[i]);

    }

    printf("n");

    memcpy(arr,

           (unsigned char[]){ '1', '2', '3' },

           sizeof arr);

    printf("Updated unsigned char array:n");

    for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {

        printf("%c ", arr[i]);

    }

    printf("n");

    return 0;

}

Рекомендуемые посты:

  • символ без знака в C с примерами
  • размер типа данных char и массива char в C
  • C / C ++ программа для поиска размера int, float, double и char
  • Максимальная длина палиндромной подстроки, так что она начинается и заканчивается данным символом
  • Найти исходный массив из зашифрованного массива (массив сумм других элементов)
  • Найти элемент в массиве так, чтобы сумма левого массива была равна сумме правого массива
  • Минимальная стоимость достижения конца массива массива, когда разрешен максимальный скачок индекса K
  • Подсчитать количество перестановок массива, не имеющего вложенного массива размером два или более из исходного массива
  • Минимальное число больше максимального массива, которое не может быть сформировано с использованием чисел в массиве
  • Найдите минимальное значение, чтобы назначить все элементы массива так, чтобы произведение массива стало больше
  • Увеличьте размер массива, удалив ровно k подмассивов, чтобы сделать массив простым
  • Генерация исходного массива из массива, который хранит количество больших элементов справа
  • Печать измененного массива после нескольких операций увеличения диапазона массива
  • Проверьте, существуют ли два элемента в массиве, сумма которых равна сумме остатка массива
  • Учитывая отсортированный массив и число x, найдите пару в массиве, сумма которой ближе всего к x

Установить значение массива unsigned char в C во время выполнения

0.00 (0%) 0 votes

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить маску подсети на телефоне
  • Как изменить маску подсети на роутере
  • Как изменить маску подсети на андроид
  • Как изменить маску подсети на windows 10
  • Как изменить маску подсети на dhcp

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии