thakurcoder Ответов: 2

Программа для реверсирования строки с помощью указателей на языке Си


Здравствуйте ребята я пытаюсь сделать программу на языке Си для реверсирования строки возвращая указатель на символ из функции

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

#include<stdio.h>
#include<stdlib.h>

char* reversestring(char* input);
int main()
{
	int i;
	char* output;
	char inputstring[100];
	printf("enter the string\n");
	gets(inputstring);
	output = reversestring(inputstring);

я хочу напечатать одну и ту же строку в обоих направлениях то есть с помощью printf и запустив цикл пожалуйста предложите мне оба способа печати в одной программе

здесь я взял i=0 до 4 для фиксированной строки Здесь я предполагаю, что пользователь введет фиксированную строку длиной 5 символов, потому что я не знаю правильного способа
	printf("%s\n",output);
	for(i=0;i<4;i++) {
		printf("%c",(output+i));
	}
}


обратная функция начните отсюда
char* reversestring(char* input)
{
    int count=0,begin,end;

	char* output=(char*) malloc(100);
	while(*input!=0) {
		count++;
	}

	end=count-1;

	for(begin=0;begin<count;begin++) {
		*(output+begin)=*(input+end);
		 end--;
	}

	output[begin]='\0';
	return output;
}

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

2 Ответов

Рейтинг:
17

User 7429338

Эта петля не закончится:

while(*input!=0) {
    count++;
}


Вы могли бы заменить его на:
while (*(input + count) != 0) {
    count++;
}


Чтобы напечатать перевернутую строку символ за символом, используйте функция strlen[^]:
for (int i = 0; i<strlen(output); i++) {
    printf("%c", *(output + i));
}


CPallini

for (int i = 0; i<strlen(output); i++)
квадратична по длине строки

[no name]

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

CPallini

Мой 5.

Рейтинг:
10

CPallini

На мой взгляд, распределение памяти должно быть ответственностью вызывающего абонента. Более того, никогда и никогда не используйте gets функция.
Попробуй

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * reverse( char * rev, const char *  str, size_t length )
{
  size_t n;
  for (n=0; n<length; ++n)
  {
    rev[n] = str[length-1-n];
  }
  rev[n] ='\0';
  return rev;
}

int main()
{
  char s[100];
  printf("please enter the string:\n");

  if ( ! fgets( s, sizeof(s), stdin) ) return -1;

  size_t length = strlen(s);

  char * r = (char *) malloc( length+1 );
  if ( ! r ) return -2;

  reverse( r, s, length);

  printf("reversed: %s\n", r);

  free(r);
  return 0;
}


[no name]

5 - я полностью согласен с тем, что распределение памяти является обязанностью вызывающего абонента, но, учитывая предыдущий вопрос, я понял, что это не то, что он хотел. https://www.codeproject.com/Questions/1247845/Program-to-reverse-a-string-using-pointers-in-C

CPallini

Большое спасибо.