установка конца символа * вручную не работает - PullRequest
1 голос
/ 05 ноября 2011

Я написал эту короткую программу

int main(){
    char * c = "abcd";
    c[1] = '\0';
    cout << c << endl;
}

и она не работает ... на самом деле она компилирует программу, но во время выполнения возникает ошибка ... Почему?Я думал, что он напечатает «а», так как «строка» теперь выглядит следующим образом: «a0cd», поэтому после нуля он должен обнаружить конец строки, верно?Так в чем же проблема?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 05 ноября 2011

Вы не можете изменять строковые литералы таким образом.

Попробуйте вместо этого:

int main(){
    char c[] = "abcd";
    c[1] = '\0';
    cout << c << endl;
}

Причина этого заключается в том, что строковые литералы хранятся в глобальной памяти (часто в сегменте только для чтения). Их изменение - неопределенное поведение. Однако, если вы инициализируете его как массив char c[] = "abcd", он будет в стеке (в отличие от глобальной памяти), поэтому вы можете свободно изменять его.

1 голос
/ 05 ноября 2011

если вы используете C ++, почему бы не использовать std :: string :: substr ?

#include <iostream>
#include <string>
int main () {
  std::string c = "abcd";
  std::string d = c.substr(0,2);
  std::cout << d << std::endl;
  return 0;
}

вывод программы:

 ab
...