Нахождение длины строки без использования библиотечной функции - PullRequest
0 голосов
/ 08 октября 2019

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

Например:

Enter name:
ISRO
Name is ISRO
Length is 4
&
Process returned 17

Код:

int stringlength (char[]);

void main()
{
    char str[20];
    int len;
    printf("Enter name:\n");
    gets(str);
    printf("Your name is %s\n",str);
    len = stringlength(str);
    printf("Name length is %d\n", len);

}

int stringlength (char x[])
{
    int i=0,count=0;

    while(x[i] != '\0')
    {
        count++;
        i++;
    }
    return count; (Point 1)
}

Ответы [ 4 ]

3 голосов
/ 08 октября 2019

Возможно, вы запутались из-за строки "Процесс вернул 17". Обычно это строка, напечатанная в IDE. Это потому что main должен возвращать код выхода. Объявите main функцию как int main() и добавьте return 0; в конце.

В действительности она возвращает результат последней функции. В вашем случае это printf, которое возвращает количество напечатанных символов.

0 голосов
/ 08 октября 2019

Пожалуйста, найдите код для определения длины строки без использования встроенной функции. Мы можем написать функцию, не усложняя ее. Как основной ученик, я мог бы совершать подобные ошибки. Спасибо всем, что нашли время, чтобы исправить мои сомнения. Счастливого обучения.

      #include <stdio.h>

       void main()
  {
       char string[50];
       int i, length = 0;

      printf("Enter a string \n");
      gets(string);

     for (i = 0; string[i] != '\0'; i++)
    {
          length++;
     }

       printf("The length of %s = %d\n", string, length);
      }
0 голосов
/ 08 октября 2019

Для начинающих функция gets не является стандартной функцией C, то есть больше не поддерживается стандартом C. Вместо этого используйте стандартную функцию fgets.

Например,

printf( "Enter name: " );
fgets( str, sizeof( str ), stdin );
str[ strcspn( str, "\n" ) ] = '\0';

Кроме того, функция main без параметров в соответствии со стандартом C должна быть объявлена ​​как

int main( void )

Что касается функции, которая находит длину строки, то она должна быть объявлена ​​следующим образом

size_t stringlength( const char s[] );

и может быть упрощена как

size_t stringlength( const char s[] )
{
    size_t n = 0;

    while( *s++ != '\0' ) ++n;

    return n;
}

В main вы можете написать

size_t len = stringlength(str);
printf("Name length is %zu\n", len);
                       ^^^

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

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

size_t stringlength( const char s[] )
{
    size_t n = 0;

    while( *s++ != '\0' ) ++n;

    return n;
}

int main(void) 
{
    enum { N = 20 };
    char str[N];

    printf( "Enter name: " );

    fgets( str, sizeof( str ), stdin );
    str[ strcspn( str, "\n" ) ] = '\0';

    printf( "Your name is %s\n", str );

    size_t len = stringlength( str );
    printf( "Name length is %zu\n", len );  

    return 0;
}

Ее вывод может выглядеть как

Enter name: Gokul UK
Your name is Gokul UK
Name length is 8
0 голосов
/ 08 октября 2019

Проблема в том, что функция gets() была удалена из стандарта C и не должна использоваться (однако многие компиляторы и платформы все еще ее реализуют). Таким образом, я не уверен, как ваша реализация справится с этим. В Visual Studio 2019 я запускаю вашу программу, и она работает! (MSVC имеет gets в библиотеке времени выполнения, но не в заголовках, поэтому он видит его как «unknown return int», что позволило бы ему использовать код в двоичном RTL.)

Однако, еслиЯ меняю gets(str); на стандартное fgets(str, 20, stdin);, тогда я получаю длину на единицу больше, чем я (или вы) ожидаем. (Это то, что вы видите?)

Причина появления дополнительного символа в том, что функция fgets возвращает строку, в которую включает завершающуюсимвол новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...