Nick_is_asking Ответов: 3

Найти длину строки в C (задача)


- Привет!!!
У меня проблема с кодом на языке Си.
Я читаю ввод от пользователя и хочу извлечь длину ввода с помощью указателя,но получаю некоторые ошибки в терминале.


Заранее спасибо...

Ошибка:
find_string_length_pointer.c: In function ‘main’:
find_string_length_pointer.c:10:24: error: invalid initializer
     char user_in[50] = user_input();
                        ^~~~~~~~~~
find_string_length_pointer.c: In function ‘user_input’:
find_string_length_pointer.c:20:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[50]’ [-Wformat=]
     scanf("%s" , &user_input);
            ~^    ~~~~~~~~~~~
find_string_length_pointer.c:21:12: warning: return makes integer from pointer without a cast [-Wint-conversion]
     return user_input;
            ^~~~~~~~~~
find_string_length_pointer.c:21:12: warning: function returns address of local variable [-Wreturn-local-addr]


Что я уже пробовал:

#include <stdio.h>


char user_input();
int length_input(char *str_input);


int main(void)
{
    char user_in[50] = user_input();
    int str_length = length_input(user_in);
    printf("Length of input: %s , is: %d." , user_in , str_length);
}


char user_input()
{
    char user_input[50];
    printf("Give a letter/string/sentence to find it length: ");
    scanf("%s" , &user_input);
    return user_input;
}


int length_input(char *str_input)
{
    int length = 1;
    while(*str_input != '\0')
    {
        length++;
        str_input++;
    }
    return length;
}

Richard MacCutchan

Почему бы не использовать strlen, который делает это за вас?

3 Ответов

Рейтинг:
6

CPallini

Для того чтобы исправить ошибки в вашей программе, выполните следующие действия: Грег Ютас, вы могли бы написать

#include <stdio.h>

void user_input(char * str_input);
int length_input(char *str_input);

int main(void)
{
  char user_in[50];
  user_input( user_in );
  int str_length = length_input(user_in);
  printf("Length of input: %s , is: %d." , user_in , str_length);

  return 0;
}

void user_input(char * str_input)
{
  printf("Give a letter/string/sentence to find it length: ");
  scanf("%s" , str_input);
}

int length_input(char *str_input)
{
  int length = 0;
  while(*str_input != '\0')
  {
    length++;
    str_input++;
  }
   return length;
}
Это бы сработало, но, к сожалению, user_input функция не является надежной: scanf может переполнить ваш буфер. Видеть Как предотвратить scanf, вызывающий переполнение буфера в C? - Stack Overflow[^] для обходных путей.


Rick York

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

Как бы то ни было, вы совершенно правы.

Nick_is_asking

Спасибо, ребята.Это прекрасно работает.
Как я могу читать пользовательский ввод до тех пор , пока новая строка ('\n', не работает, потому что я получаю эту ошибку: ошибка сегментации (ядро сбрасывается) и '\0' используется до нулевого символа.)?

Рейтинг:
24

Greg Utas

Ваш user_input функция объявляет массив user_input как локальная переменная. Когда эта функция возвращается, эти данные исчезают! Вам нужно пройти user_inmain) в качестве аргумента к user_input функция.

Хотя это не ошибка, используя то же самое имя (user_input) для функции и локальной переменной в этой функции сбивает с толку.

У вас может быть больше ошибок, но это было первое, что я заметил.

По отношению к length_input, C обеспечивает функцию strlen чтобы найти длину строки.


Greg Utas

Вам нужно передать user_in вашей функции user_input, так же как вы передаете его своей функции length_input.

EDIT: большинство (или все) ошибок, которые вы получаете при компиляции, связаны с тем, что user_input возвращает символ, который затем вы пытаетесь присвоить массиву символов.

CPallini

5.

Рейтинг:
13

Rick York

Мистер Утас на правильном пути. У вас это довольно близко, но это требует некоторых изменений. Вот один из способов :

void get_input( char * input )
{
    printf( "Enter a string to find its length: " );
    scanf( "%s", input );
}

int main( void )
{
    int str_length = 0;
    char user_in[ 50 ] = { 0 }

    get_input( user_in );
    str_length = length_input( user_in );
    printf( "Length of input: '%s' is: %d\n" , user_in , str_length );
}

Ваша функция длины выглядит ОК. есть проблема : он должен инициализировать длину до нуля.


CPallini

"Ваша функция длины выглядит нормально"
Это просто немного чересчур. :-)
Мой 5.

Rick York

Хорошая точка. Будем надеяться, что он это поймет.