Простая модификация строк C с помощью указателей - PullRequest
3 голосов
/ 27 мая 2010

У меня есть два указателя на одну и ту же строку C. Если я увеличу второй указатель на единицу и назначу значение второго указателя первому, я ожидаю, что первый символ первой строки будет изменен. Например:

#include "stdio.h"

int main() {
  char* original_str = "ABC";        // Get pointer to "ABC"
  char* off_by_one = original_str;   // Duplicate pointer to "ABC"
  off_by_one++;                      // Increment duplicate by one: now "BC"
  *original_str = *off_by_one;       // Set 1st char of one to 1st char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "BBC"?)
  *original_str = *(off_by_one + 1); // Set 1st char of one to 2nd char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "CBC"?)

  return 0;
}

Это не работает. Я уверен, что упускаю что-то очевидное - у меня очень, очень маленький опыт работы с C.

Спасибо за вашу помощь!

Ответы [ 2 ]

10 голосов
/ 27 мая 2010

Вы пытаетесь изменить строковый литерал. Строковые литералы не могут быть изменены (т.е. они доступны только для чтения).

Программа, которая пытается изменить строковый литерал, демонстрирует неопределенное поведение: программа может быть в состоянии «успешно» изменить строковый литерал, программа может аварийно завершить работу (немедленно или позднее), программа может показать необычное и неожиданное поведение или что-то еще может произойти. Все ставки отключены, когда поведение не определено.

Ваш код объявляет original_string как указатель на строковый литерал "ABC":

char* original_string = "ABC";

Если вы измените это на:

char original_string[] = "ABC";

тебе должно быть хорошо идти. Это объявляет массив char, который инициализируется содержимым строкового литерала "ABC". Массиву автоматически присваивается размер четырех элементов (во время компиляции), потому что это размер, необходимый для хранения строкового литерала (включая нулевой терминатор).

1 голос
/ 27 мая 2010

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

Попробуйте char[] original_string = "ABC", который использует массив для хранения строки, которую вы можете изменить.

...