Сторнирование строки в C с использованием цикла while - PullRequest
1 голос
/ 29 апреля 2019

Этот код в основном должен принимать строку, скажем, например, что это "abc de fgh", вывод должен быть

cba
ed
hgf

Мой код, показанный здесь, действительно помещает строку в строку, ноэто не меняет их.У меня возникают проблемы при разработке этой части и о том, как использовать символы * из моего аргумента в методе.любая помощь в правильном направлении была бы великолепна!

void stringReverse(char* s){

    char* i = 0;
    char* j = strlen(s)-1;
    //in order to swap the characters s[i] and s[j] make a temp
    char* temp;

    while(i < j){
        temp = i;
        i = j;
        j = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Ответы [ 5 ]

4 голосов
/ 29 апреля 2019

Ваш код, кажется, смешивает понятия использования индекса (например, 0 или strlen(s)-1) или использования указателей. Даже в комментарии вы написали «поменяйте местами символы s[i] и s[j]», но вы объявили i и j как char* переменные.

Вторая ошибка заключается в том, что вы меняете значения указателя, а не символы, на которые указывают указатели.

Вы должны решить, хотите ли вы использовать указатели или указатели для доступа к символам.

Решение с использованием указателей:

void stringReverse(char* s){

    //in order to swap the characters s[i] and s[j] make a temp
    char temp;
    char* i = s;
    /* according to the standard, the behavior is undefined if the result
     * would be one before the first array element, so we cannot rely on
     * char* j = s + strlen(s) - 1;
     * to work correct. */
    char* j = s + strlen(s); 
    if(j > i) j--; // subtract only if defined by the C standard.

    while(i < j){
        temp = *i;
        *i = *j;
        *j = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Решение с использованием индекса:

void stringReverse(char* s){

    size_t i = 0;
    size_t j = strlen(s)-1;
    //in order to swap the characters s[i] and s[j] make a temp
    char temp;

    while(i < j){
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;

        i++;
        j--;
    }
    //end of the while loop means that it reversed everything (no need for if/else)
}

Компилятор должен предупреждать о некоторых проблемах в исходном коде, если включено достаточное количество предупреждений. Я предлагаю всегда включать как можно больше предупреждений.

2 голосов
/ 29 апреля 2019

Значения i и j являются только числом, представляющим местоположение в строке, в которой существует интересующее вас значение.

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

Так что вместо:

temp = i;
i = j;
j = temp;

Попробуйте:

temp = s[i];
s[i] = s[j];
s[j] = temp;

также, как упоминалось в комментариях, если функция объявлена ​​как возвращающая void, вы не должны возвращать значение.

0 голосов
/ 29 апреля 2019

Попробуйте это тоже работает

#include<stdio.h> 
#include<string.h>  
int main() 
{ 
   char str[10] = "abc"; 

   printf("The given string is =%s\n",str); 

   printf("After reversing string is =%s",strrev(str)); 

   return 0; 
} 
0 голосов
/ 29 апреля 2019

Здесь вы идете без использования какой-либо временной переменной, я не тестировал этот код, как это делал я, когда столкнулся с подобным вопросом в интервью

    void stringReverse(char* str){

        char* i = 0;
        char* j = strlen(str);


    while(i < (j/2)){
        strl[j]= str[j-i-1];
        str[i+1] = str[j];
        str[i]=str[j];
        i++;       
    }
   str[j]="\0";

    }
0 голосов
/ 29 апреля 2019

Вы хотите этого. Пояснения в комментариях.

void stringReverse(char* s) {

  int i = 0;                // int instead of char*
  int j = strlen(s) - 1;    // int instead of char*
  char temp;                // char instead of char*

  while (i < j) {
    temp = s[i];            // actually exchange the two characters
    s[i] = s[j];
    s[j] = temp;

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