Как вы назначаете подстроки в C? - PullRequest
2 голосов
/ 07 февраля 2012

Я пытаюсь выяснить, почему это не работает:

#include <stdio.h>
int main ()
{
  char *orig = "Hey you guys.";
  char *str;
  str = &orig;
  while(*str++) {
    if (*str == 'y')
        *str = '@';
  }
  puts(orig);
  return 0;
}
// OUTPUT => "Hey you guys."
// Not "he@ @ou gu@s." as expected.

Назначая str = & orig, я подумал, что str будет использовать тот же адрес памяти, что и orig. Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

(1) для совместного использования памяти, которую вы хотите сделать str = orig, поскольку str уже является типом указателя.
(2) orig определяется как строковый литерал, константа - поэтому вы не можете изменить значение "Hey you guys.", даже если при обращении к нему через str, это приведет к ошибке времени выполнения.

РЕДАКТИРОВАТЬ: Проблема № 3: В цикле while вы сначала увеличиваете указатель, а только потом проверяете, является ли он 'y', иизменить.При этом - вы пропустите первый элемент ."yasdf" станет "yasdf", а не "@asdf", как вы ожидаете.[в общем, я думаю, что вы ожидаете ...]

Чтобы добиться того, чего вы хотите, вы можете следовать этому: [используя strcpy и буфер, чтобы избежать записи в постоянную память]

#include <stdio.h>
#include <string.h>
int main ()
{
  char *orig = "Hey you guys.";
  char buff[14]; //the length of orig + 1 byte for '\0'
  char *str = buff; //since str and buff are already pointers
  strcpy(str,orig);
  while(*str) {
    if (*str == 'y')
        *str = '@';
    str++;
  }
  puts(buff);
  return 0;
}
2 голосов
/ 07 февраля 2012

Две вещи:

  • &orig - это адрес указателя .Возможно, вы хотите str = orig.Ваш компилятор должен был предупредить вас о несоответствии типов указателей здесь;если это не так, то увеличивайте уровень предупреждения до тех пор, пока это произойдет.
  • Изменение константной литеральной строки не всегда будет работать.Используйте char orig[] = "Hey you guys.", который копирует буквенную строку в массив с именем orig, который вы можете безопасно изменять.
0 голосов
/ 07 февраля 2012
  1. вы пропустили первый элемент
  2. вы не можете изменить строковый литерал
  3. Модифицированный код:
#include <stdio.h>

int main ()
{
    char orig[] = "Hey you guys.";
    char *str;
    str = orig;
  int i;
    while(*str){
      if (*str == 'y')
            *str = '@';
      *str++;
    }
    puts(str);
  puts(orig);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...