Ошибка при проверке, достигает ли указатель конца строки - PullRequest
0 голосов
/ 14 октября 2018

Я работаю над проблемой обращения строк, когда пытаюсь обменять значения с двух сторон друг на друга.Как часть обратной функции, у меня есть строка, которая проверяет, достиг ли указатель символа конца строки (в форме while(*end!= '\0')).Однако, похоже, это не работает, и в конце цикла while, когда я отменяю ссылку «end», я получаю пустое значение.Когда я использую (while(*end)), все работает отлично, но я должен затем уменьшить мой указатель «конец», чтобы убедиться, что я получаю доступ к последнему элементу моей строки.Почему я не могу проверить указатель на строковый литерал '\ 0'?

#include<stdio.h>

void reverse(char* s);

void main(){
    char str[]="abcdef";
    printf("%s\n",str);
    reverse(str);
    printf("%s\n",str);
}

void reverse(char* p){  
    char* start = p;
    char* end = p;
    char tmp;
    int length =0;

    while(*end!='\0'){
        end+=1;
        length+=1;
    }
    printf("%c\n",*end); // problem line

    int c;
    for (c = 0; c < length/2; c++)
    {        
      tmp   = *start;
      *start   = *end;
      *end = tmp;

      start++;
      end--;
    }
    //printf("%s\n",p);
}

Ответы [ 4 ]

0 голосов
/ 14 октября 2018

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

#include <stdio.h>

void reverse(char *start);

int main(void) {
    char str[]= "abcdef";
    printf("%s\n", str);
    reverse(str);
    printf("%s\n", str);
}

void reverse(char* start) {
    char *end = start;
    while(*end != '\0') {
        end++;
    }
    while(start < end) {
        char temp = *--end;
        *end = *start;
        *start++ = temp;
    }
}
0 голосов
/ 14 октября 2018
#include <stdio.h>
#include <string.h>

size_t mystrlen(const char *str)
{
    const char *ptr = str;

    while(*ptr++);

    return ptr - str;
}

char *reverse(char *str)
{
    size_t len = mystrlen(str);
    char *end = str + len -1;
    char *saved = str;

    len /= 2;
    while(len--)
    {
        char tmp = *str;
        *str++ = *end;
        *end-- = tmp;
    }
    return saved;
}

int main(void)
{
    char str[] = "This is the string which will be reversed";

    printf("%s\n", reverse(str));

}
0 голосов
/ 14 октября 2018

твой код работает.конец достигает «\ 0».но printf печатает строку до первого '\ 0'.поэтому ваш отпечаток выглядит пустым.если вы добавите после цикла while:
--end;или измените while на: while (* (end + 1)) ваш код будет делать то, что вы хотите

0 голосов
/ 14 октября 2018

В //Problem line значение *end равно '\0' - Вы должны напечатать целочисленное значение '\0', чтобы убедиться, что 0 , и это работает - кроме того, вы будетенеобходимо раскомментировать функцию } из reverse.

'\0' - это непечатаемый символ: Ссылка: непечатные и печатные символы ASCII

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