Ваш код имеет четыре проблемы.
- Вы используете
gets
, чтобы поймать строку из stdin
. Никогда не используйте gets
. Это устарело из-за соображений безопасности, поскольку при этом вы можете легко столкнуться с переполнением буфера, когда входная строка длиннее самого буфера. gets
не прекращать сканирование.
Почему функция get так опасна, что ее не следует использовать?
Вместо этого используйте fgets
, который ограничивает ввод в соответствии с размером буфера:
fgets(str, sizeof str, stdin);
Неверный тип параметра
distinct_or_not_string()
:
char distinct_or_not_string(char *string []);
string
имеет тип char **
, но вы хотите передать указатель на строку. Используйте char string[]
или char *string
, где string
имеет тип char *
.
Второй, в то время как l oop использует неверный объект для проверки условия,
i
вместо
j
:
while(string[i]!='\0')
Использование
printf
в качестве возвращаемого значения
distinct_or_not_string()
:
return printf("false");
printf()
всегда будет оцениваться как 1
(при условии отсутствия ошибок при печати) и, таким образом, result
в функции main
всегда будет иметь 1
независимо от того, в строке есть какой-либо символ дважды или более или нет, что не подходит.
Разделите оба и разделите каждый оператор:
printf("false");
return 0;
и
printf("true");
return 1;
Примечание: distinct_or_not_string()
не нужно возвращать char
; возвращаемое значение в этом случае не имеет ничего общего со строкой или ее символом.
Поэтому тип возвращаемого значения distinct_or_not_string()
, на мой взгляд, предпочтительнее будет int
для лучшей читаемости и во избежание путаница, хотя это не ошибка syntacti c, чтобы использовать вместо char
. Объявление функции в таком случае будет выглядеть так:
int distinct_or_not_string(char *string);
Исправленный код должен выглядеть следующим образом:
#include <stdio.h>
int distinct_or_not_string(char* string);
int main()
{
char str[20];
int result;
printf("please enter your string: ");
char *p = fgets(str,sizeof str,stdin);
if(p == NULL)
{
printf("Error occurred at reading the input!");
return 1;
}
printf("\n");
result = distinct_or_not_string(str);
return 0;
}
int distinct_or_not_string(char *string)
{
int i=0,j;
while(string[i] != '\0')
{
j=i+1;
while(string[j] != '\0')
{
if(string[i] == string[j])
{
printf("false");
return 0;
}
j++;
}
i++;
}
printf("true");
return 1;
Если вы хотите проверить этот код в Интернете, здесь это ссылка: https://onlinegdb.com/H1PCstoSL