Как вернуть строку в основную функцию? - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь написать код для реализации функции strchr в c. Но я не могу вернуть строку.

Я видел дискуссии о том, как вернуть строку, но я не получаю желаемый вывод

const char* stchr(const char *,char);
int main()
{
    char *string[50],*p;
    char ch;
    printf("Enter a sentence\n");
    gets(string);
    printf("Enter the character from which sentence should be printed\n");
    scanf("%c",&ch);
    p=stchr(string,ch);
    printf("\nThe sentence from %c is %s",ch,p);
}
const char* stchr(const char *string,char ch)
{
    int i=0,count=0;
    while(string[i]!='\0'&&count==0)
    {
        if(string[i++]==ch)
            count++;
    }
    if(count!=0)
    {
        char *temp[50];
        int size=(strlen(string)-i+1);
        strncpy(temp,string+i-1,size);
        temp[strlen(temp)+1]='\0';
        printf("%s",temp);
       return (char*)temp;
    }
    else
        return 0;
}

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

Enter a sentence
i love cooking
Enter the character from which sentence should be printed
l
The sentence from l is (null)

1 Ответ

1 голос
/ 28 октября 2019

В вашем коде есть только две настоящие ошибки плюс одна строка, которая, ИМХО, безусловно, должна быть изменена. Вот ошибки с решениями:

(1) Как отмечено в комментариях, строка:

char *string[50],*p;

объявляет string как массив из 50 символов указатели , тогда как вы просто хотите массив из 50 символов. Используйте это вместо:

char string[50], *p;

(2) Есть две проблемы со строкой: char * temp [50];Во-первых, как отмечено в (1), вы объявляете массив символьных указателей, а не массив символов. Во-вторых, поскольку это локально определяемая («автоматическая») переменная, она будет удалена при выходе из функции, поэтому ваша переменная p в main будет указывать на некоторую память, которая была удалена. Чтобы исправить это, вы можете объявить (локальную) переменную как static, что означает, что она останется фиксированной в памяти (но см. Добавленную сноску об использовании static переменных):

static char temp[50];

И наконец, опять же, как уже упоминалось в комментариях, вы должны , а не использовать функцию gets, поскольку она теперь устарела (хотя некоторые компиляторы все еще поддерживают ее). Вместо этого вы должны использовать функцию fgets и использовать stdin в качестве «исходного файла»:

fgets(string, 49, stdin);/// gets()  has been removed! Here, 2nd argument is max length.

Другая незначительная проблема - это использование функций strlen и strncpy. Первый фактически возвращает значение типа size_t (всегда без знака целочисленного типа), а не int (всегда со знаком );последний использует такой тип size_t в качестве последнего аргумента. Таким образом, вы должны иметь эту строку вместо того, что у вас есть в настоящее время:

size_t size = (strlen(string) - i + 1);

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

РЕДАКТИРОВАТЬ: потенциальная проблема, когдас помощью static Solution

Как отмечается в комментариях Basya , использование статических данных может вызвать проблемы, которые трудно отследить при разработке программ с несколькимипотоки: если два разных потока попытаются получить доступ к данным одновременно, вы получите (в лучшем случае) «гонку данных» и, что более вероятно, непредсказуемое поведение, которое трудно отследить. Лучшим способом в таких обстоятельствах является динамическое выделение памяти для переменной из «кучи» с использованием стандартной функции malloc (определенной в <stdlib.h> - обязательно #include этот заголовок):

char* temp = malloc(50);

Если вы используете этот подход, обязательно освободите память, когда закончите с ней, используя функцию free(). В вашем примере это будет в конце main:

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