Я хотел бы знать, что является причиной, которая вызывает неправильное отображение в моем коде? - PullRequest
0 голосов
/ 15 марта 2020

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


#include <stdio.h>
char distinct_or_not_string(char *string []);
int main()
{ 
  char str[20];
  char result;
  printf("please entre your string:");
  gets(str);
  printf("\n");
 result=distinct_or_not_string(str);   

}
char distinct_or_not_string(char *string [])
{
    int i=0,j;
    while(string[i]!='\0')
    {
        j=i+1;
        while(string[i]!='\0')
        {
              if(string[i]==string[j])
              {
                  return printf("false");
              }
         j++;
        }
        i++;
    }
    return printf("true");
}

Ответы [ 3 ]

0 голосов
/ 15 марта 2020

Ваш код имеет четыре проблемы.

  1. Вы используете 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

0 голосов
/ 15 марта 2020

моя ошибка во втором l oop, где я использовал тот же индекс i вместо j, поэтому условие всегда выполняется, поэтому следующий код работает успешно

#include <stdio.h>
char distinct_or_not_string(char string []);
int main()
{ 
  char str[20];
  char result;
  printf("please entre your string:");
  gets(str);
  printf("\n");
 result=distinct_or_not_string(str);   

}
char 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])
              {
                  return printf("false");
              }
         j++;
        }
        i++;
    }
    return printf("true");
}
0 голосов
/ 15 марта 2020

изменить это

 char distinct_or_not_string(char *string [])

на

 char distinct_or_not_string(char string [])

и

изменить это в секунду, в то время как l oop

while(string[i]!='\0')

на

while(string[j]!='\0') 
...