как заменить символ в символе * - PullRequest
3 голосов
/ 02 декабря 2010

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

#include <stdio.h>

int main(int argc, char **argv)
{
    char *mystring ="love is alweys better yoe";
    int count = 1;

    for (count ;  count < 23; count++)
    {     
    if ((mystring[count] == 0x65 )) //&& ((mystring[count+1] > 0x41) && (mystring[count+1] < 0x7A))) 
    {
      mystring[count] = 0x45; //here occur the freezing
      printf ("%c\n", mystring[count]); 
      //break;
    };
    };

    printf("%s\n",mystring);
    return 0;
}

Ответы [ 3 ]

10 голосов
/ 02 декабря 2010

char *mystring ="love is alweys better yoe"

делает mystring доступным только для чтения

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

, например

char mystring[128];
strcpy( mystring , "love is alweys better yoe" );
9 голосов
/ 02 декабря 2010

Распределение стека

char *mystring ="love is alweys better yoe";

Это создает строковый литерал в постоянной памяти, и вы не можете впоследствии записать его для изменения символов.

Вы должнывместо этого инициализируйте вашу строку следующим образом:

char mystring[] ="love is alweys better yoe";

Это выделит массив символов размером 26 байт - 1 байт на символ, заканчивающийся нулевым символом \0.

Обратите внимание, что есливы пытаетесь записать после конца буфера (т. е. после символа \0), вы можете вторгаться в память, выделенную для других данных в вашей программе, и это может иметь нежелательные последствия.

Распределение кучи

Предыдущий пример выделяет память в стеке и будет освобожден в конце текущего уровня области видимости (обычно это функция, в которой вы находитесь).Если вы хотите, чтобы память сохранялась после завершения вызова функции, вам нужно выделить ее в куче следующим образом:

int bufferSize = 26;
char* mystring = malloc(bufferSize);
strncpy(mystring, "love is alweys better yoe", bufferSize);

И вам нужно будет помнить free эту память, когда выпокончим с этим:

free(mystring);

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

Увеличение размера строки

Если вам нужно изменить размер строки после выделенияпамяти для него можно использовать realloc:

char* mybiggerString = realloc(mystring, bufferSize + 10);
strncpy(mystring, "I can fit more in this string now!", bufferSize);
5 голосов
/ 02 декабря 2010

«в символе» бессмысленно. Вы не можете изменить то, что находится «в» указателе, потому что нет ничего «в» указателе - он не содержит вещей. Это указывает на вещи. Вот почему он называется «указатель», а не «контейнер».

Когда вы пишете char *mystring ="love is alweys better yoe";, вы заставляете mystring указывать на строковый литерал . Это кусок памяти, который предназначен для хранения текста. В специальной области памяти нельзя изменить . (Текст хранится в файле .exe; в большинстве реализаций ОС загружает файл .exe в память, а затем указывает указатель на эту часть загруженного файла .exe. Вы не можете изменять эту память, поскольку ОС запрещает это - в основном, чтобы было сложнее создать вирус.)

Решение: использовать модифицируемый кусок памяти. Запишите это так: char mystring[] = "love is alweys better yoe";. Строковый литерал все еще будет существовать в вашей программе, но это заставит программу создать буфер (в памяти, который может быть изменен) и скопировать литерал в буфер. Этот буфер точно такой же длины, что и литерал, поэтому вы все равно не можете добавить к строке - только измените существующие символы или обрежьте его (записав нулевой байт где-то посередине).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...