Изучение C путем поиска строки - PullRequest
0 голосов
/ 14 мая 2011

Я нашел это в коде, который я сейчас изучаю, может кто-нибудь объяснить мне.

char * string = "Simulated Annealing = 12847369";
char * value = strchr(string, '=');

*(value ++ ) = 0;


printf("%s ==== %s", value, string);

Я заметил, что строка будет сначала печататься в новой строке, почему это?

char* karmarkar = "Karmarkar   958572";

Я хочу использовать strchr, чтобы найти первое вхождение "space" в строке karmarkar.Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 14 мая 2011
  1. Нет, новая строка не ставится http://codepad.org/xhTiV4Qn.На самом деле на моей машине он выдает sigsegv, потому что вы пытаетесь писать в месте только для чтения внутри "Simulated ...".
  2. int pos = strchr(karmarkar, ' ') - karmarkar;.strchr(karmarkar, ' ') возвращает указатель на первое вхождение "" (пробел).
1 голос
/ 14 мая 2011

Прежде всего

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

char * string = "Simulated Annealing = 12847369";

Затем вы найдете первое вхождение = в этой строке и поместите указатель на нее в value:

char * value = strchr(string, '=');

Итак, value теперь указывает на постоянную память или value = NULL, так что это строка с неопределенным поведением:

*(value ++ ) = 0; // assign value to read-only memory

если скажем, вы написали

char string[] = "Simulated Annealing = 12847369";

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

Теперь к вашему вопросу

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

char string[] = "Simulated Annealing = 12847369";
char * value = strchr(string, '=');
*(value ++ ) = 0;
printf("First line");
printf("%s ==== %s", value, string);

Чтобы найти первое вхождение символа пробел , используйте strchar(karmarkar, ' '):.

И еще раз, когда вы используете strchr, проверьте, является ли возвращаемое значение NULL, поскольку оно может быть, и если оно действительно NULL, то ваша программа, вероятно, завершится сбоем. (разыменование незаконного адреса)

1 голос
/ 14 мая 2011

Код сначала вычисляет местоположение символа '=' (как адрес, а не как индекс). Затем символ по этому адресу устанавливается на 0, а адрес значения устанавливается на следующий знак. Это завершает строку «string» перед символом «=» (который теперь равен 0), так как он заканчивается 0 и значение начинается после символа «=». Таким образом, printf распечатает «12847369 ==== Имитация отжига» (замечает, что пробелы все еще там).

Для вас второй вопрос работает аналогично, как отметил Александр в своем ответе.

0 голосов
/ 14 мая 2011

В первом случае strchr вернет указатель на байт, где в string находится '='.Вам не нужно добавлять 0 к возвращаемому значению, поскольку это просто еще один указатель на массив символов, на который указывает string, который уже завершен нулем.Чтобы напечатать символ, просто скажите value[0]:

char* string = "Simulated Annealing = 12847369";
char* value = strchr(string, '=');
if (value != NULL)
  {
    printf("value: %s, string: %s\n", value, string);
    printf("char: %c\n", value[0]); /* prints = */
  }

Сделайте то же самое, чтобы найти пробел во второй строке:

char* karmarkar = "Karmarkar   958572";
value = strchr(karmarkar, ' ');
if (value != NULL)
  printf("value: %s\n", value);

Всегда проверяйте возвращаемое значение strchrперед его использованием, так как он возвращает NULL, если символ не найден.

Кстати, оператор *(value ++) = 0 должен вызвать segfault, поскольку он пытается изменить местоположение только для чтения.Если вы нашли этот код в книге, которая утверждает, что преподает C, я предлагаю вам отойти от него и начать изучать this .Если ваш компилятор сгенерировал код, который печатает новую строку для этого конкретного оператора, вы должны начать использовать лучший компилятор.Есть несколько хороших доступных для бесплатного скачивания .

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