Невозможно выполнить код, который находит первый символ строки, которая соответствует данному символу
Этот код написан для определения позиции символа в строке сзади, которая сначала совпадает с заданным символом. Когда я использую 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';