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

Этот код написан для определения позиции символа в строке сзади, которая сначала совпадает с заданным символом. Когда я использую scanf для получения строки, компилятор не запрашивает символ и напрямую выдает результат как 0. Я не удалось исправить проблему с scanf.

Я запустил функцию, передав строку ввода напрямую без scanf, и она отлично работает.

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

int strrindex(char str[], char t)  
{   
int n=strlen(str);  

    while(n>=0)  
    {  
        if(str[n]==t)  
        {  
        return n;  
        }  
        else  
        {  
            n=n-1;  
        }       
    }
    return -1;
}  

int main()  
{  
    int k;  

    char str[100];  

    printf("enter line\n");  

    scanf("%s",str);  

    char t;  

    printf("enter letter\n");  

    scanf(" %c",&t);  

    k=strrindex(str,t);  

    int p=k+1;  

        printf("the position is %d",p);  
}  

Код выполняется, но вывод всегда равен 0, в основном из-за добавления \n из-за scanf.

1 ответ

Решение

Вы включили заявление о возврате

return -1;  

в то время как цикл

while(n>=0)  
{  
    if(str[n]==t)  
    {  
    return n;  
    }  
    else  
    {  
        n=n-1;  
    }     
return -1;  
}

Поместите это вне петли.

Обратите внимание, что функция должна быть объявлена ​​как

size_t strrindex( const char str[], char t );

и вернуться ( size_t )-1 в случае, когда символ не найден, потому что тип возврата стандартной функции C strlen является size_t,

Имейте в виду, что есть аналогичная стандартная функция C

char *strrchr(const char *s, int c);

Вот демонстрационная программа

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

size_t strrindex( const char *s, char c )
{
    size_t n = strlen( s );

    while ( s[n] != c && n != 0 ) --n;

    return n == 9 ? -1 : n;
}


int main(void) 
{
    const char *s = "Hello";

    size_t n = strlen( s );

    do
    {
        size_t pos = strrindex( s, s[n] );

        if ( pos == -1 ) 
        {
            printf( "The character %c is not found\n", s[n] );
        }
        else
        {
            printf( "The character %c is found at position %zu\n", s[n] == '\0' ? '0' : s[n], pos );
        }
    } while ( n-- );

    return 0;
}

Его вывод

The character 0 is found at position 5
The character o is found at position 4
The character l is found at position 3
The character l is found at position 3
The character e is found at position 1
The character H is found at position 0

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

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

size_t strrindex( const char *s, char c )
{
    size_t n = strlen( s );

    while ( n != 0 && s[n - 1] != c ) --n;

    return n == 0 ? -1 : n - 1;
}


int main(void) 
{
    const char *s = "Hello";

    size_t n = strlen( s );

    do
    {
        size_t pos = strrindex( s, s[n] );

        if ( pos == -1 ) 
        {
            printf( "The character %c is not found\n", s[n] == '\0' ? '0' : s[n] );
        }
        else
        {
            printf( "The character %c is found at position %zu\n", s[n] == '\0' ? '0' : s[n], pos );
        }
    } while ( n-- );

    return 0;
}

В этом случае вывод программы

The character 0 is not found
The character o is found at position 4
The character l is found at position 3
The character l is found at position 3
The character e is found at position 1
The character H is found at position 0

Также обратите внимание на то, что функция scanf читает строку, пока не встретится символ пробела.

Так что вместо scanf использование fgets, Например

fgets( str, sizeof( str ), stdin );
str[strcspn( str, "\n" )] = '\0';
Другие вопросы по тегам