Member 13404013 Ответов: 2

Как преобразовать строку из нижнего регистра в верхний без использования нотации массива?


Задача состоит в том, чтобы преобразовать строку из нижнего регистра в верхний без использования нотации массива?

Подсказка, которую мне дали, была "изменить сам указатель строки", Я думал, что вы не можете изменить указатель строки. Я не знаю, как работать с циклом while.

Любая помощь была бы очень кстати.

Что я уже пробовал:

int main(void)
{

  uppercase_no_array("reverse");

  return(0);
}

void uppercase_no_array(char* input)
{

  char* copy = malloc(sizeof(char) * strlen(input));
  strcpy(copy, input);

  printf("%s", copy);

  while(copy != '\0')
  {

   
  }
return;

}

Afzaal Ahmad Zeeshan

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

2 Ответов

Рейтинг:
2

Jochen Arndt

Цитата:
Подсказка, которую мне дали, была такова: "измените сам строковый указатель"
С моей точки зрения, это означает, что вы можете изменить строку на месте с помощью указателя:
char *p;
p = input_string;
while (*p)
{
    /* char_to_upper() has to be implemented */
    *p = char_to_upper(*p);
    p++;
}


Klaus-Werner Konrad

Это наверняка приведет к нарушению доступа к памяти; аргумент main() является строковым литералом ...

Jochen Arndt

Нет. Они не являются литералами, но записи argv[] указывают на выделенный буфер. Обычно аргументы командной строки изменяются на месте.

Из стандарта C (5.1.2.2.1 запуск программы):
"177 — параметры argc и argv и строки, на которые указывает массив argv, должны быть изменены программой и сохранять свои последние сохраненные значения между запуском программы и завершением программы."

Klaus-Werner Konrad

Ха...

тап_п(недействительными)
{
uppercase_no_array ("обратный");
возврат (0);
}

очевидно, что это литерал, а не аргумент командной строки

Рейтинг:
17

OriginalGriff

Когда вы выделяете память, copy указывает на первый символ в пространстве. Затем вы используете его для копирования входных данных в область вывода - на самом деле вам вообще не нужно этого делать, просто используйте два указателя, которые у вас уже есть: copy и input

char* uppercase_no_array(char* input)
{
  char* mem = malloc(sizeof(char) * (strlen(input) + 1));
  char* copy = mem;
  char c;
  do
  {
  c = *input++;
  ... uppercase it here ...
  *copy++ = c;
  } while(c != '\0')
  return mem;
}


Jochen Arndt

Вы забыли выделить место для нулевого байта.

OriginalGriff

Я использовал его код, Но да, вы правы.
Исправлено.

OriginalGriff

Если бы это не было ранним студенческим упражнением, я бы тоже беспокоился об освобождении, но ...