Обращение строки в c, проблема с использованием функции strlen - PullRequest
0 голосов
/ 02 апреля 2020

Я написал код для обращения строки, но функция strlen дает мне неверную длину строки, поэтому обращение строки не выполняется должным образом. Вот код, который я написал:

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

void reversestring(char string[], int start, int end);

int main() {
    char str[500];
    int n;
    n = strlen(str);
    reversestring(str, 0, n - 1);
    printf("%d\n", n);
    printf("The reverse string is %s", str);
    return 0;
}

void reversestring(char string[], int start, int end) {
    printf("enter the string:\n");
    scanf("%s", string);
    int temp;
    while (start < end) {
        //printf("insidewhile\n");
        temp = string[start];
        string[start] = string[end];
        string[end] = temp;
        start++;
        end --;
    }
}

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

strlen() не может дать вам длину строки, когда ее аргумент не указывает на допустимую строку, как в вашем примере:

char str[500];
int n;
n = strlen(str);

str isn´ t инициализируется строкой.

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

Также strlen() не делает вернуть int. Возвращаемое значение имеет тип size_t.

Также используйте fgets() вместо scanf() при вводе строки. Это немного более безопасно.


Решение:

Пусть строка вводится в main() в str, затем используется strlen() и после этого вызывается reversestring() function:

char str[500];         
size_t n;

printf("enter the string:\n");
fgets(str,500,stdin);

n = strlen(str);   
reversestring(str, 0, n-1);

Я также отредактировал объявление функции и printf() соответственно, чтобы позаботиться о типе size_t.


Вот полный код ( Онлайн Пример ):

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

void reversestring(char string[], size_t start, size_t end);

int main()
{
    char str[500];
    size_t n;

    printf("enter the string:\n");
    fgets(str,500,stdin);
    str[strcspn(str, "\n")] = 0;    // removing trailing newline from fgets

    n = strlen(str);   
    reversestring(str, 0, n-1);

    printf("%zu\n", n);
    printf("The reverse string is %s", str);
    return 0;
}


void reversestring(char string[], size_t start, size_t end)
{
    int temp;
    while(start < end)
    {   //printf("insidewhile\n");
        temp = string[start];
        string[start] = string[end];
        string[end] = temp;
        start++;
        end --;
    }
}

Вывод:

enter the string:             
helloworld     
10                     
The reverse string is dlrowolleh
0 голосов
/ 02 апреля 2020

В объявленном символьном массиве нет строки

{   char str[500];
    int n;

Массив символов не инициализирован. Таким образом, этот вызов

n = strlen(str);

приводит к неопределенному поведению.

Этот фрагмент кода из функции reversestring

printf("enter the string:\n");
scanf("%s", string);

должен находиться вне функции и использоваться до того, как функция будет call.

Функция должна быть объявлена ​​как минимум как

char * reversestring( char string[], size_t n );

Нет необходимости объявлять функцию с тремя параметрами, как вы это сделали

void reversestring(char string[], int start, int end);

, потому что вызов этой функции может быть заменен вызовом предыдущей показанной функции, такой как

reversestring( string + start, end - start + 1 );

Также обратите внимание на то, что использование формата %s не позволяет вводить предложение. Более того, использование этого спецификатора формата с функцией scanf небезопасно, а функция strlen имеет тип возврата size_t.

Вот определение функции

char * reversestring( char s[], size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-i -1];
        s[n-i-1] = c;
    }

    return s;
}

Здесь демонстрационная программа.

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

char * reversestring( char s[], size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n-i -1];
        s[n-i-1] = c;
    }

    return s;
}

int main(void) 
{
    enum  { N = 500 };
    char s[N];

    printf( "Enter a string: " );

    fgets( s, N, stdin );

    s[ strcspn( s, "\n" ) ] = '\0';

    size_t n = strlen( s );

    puts( reversestring( s, n ) );

    char *p = strchr( s, ' ' );

    if ( p != NULL && ( p = strchr( p + 1, ' ' ) ) != NULL )
    {
        reversestring( s, p - s );
        puts( s );
    }

    return 0;
}

Ее вывод может выглядеть, например, как

Enter a string: Hello Shivam Gupta
atpuG mavihS olleH
Shivam Gupta olleH
0 голосов
/ 02 апреля 2020

Вы должны использовать strlen после инициализации str и установить правильный размер третьего аргумента reversestring:

size_t max_length = 128;

reversestring(str, 0, max_length);
n = strlen(str);
...