Поток команд в C, вызов функции после printf - PullRequest
0 голосов
/ 21 апреля 2020

Итак, у меня есть этот сверхпростой код C, принимающий пользовательский ввод и распечатывающий его, за которым следует «T-Plus», пока l oop. В этом случае я выбрал случайное имя для проверки «whoa», но пока l oop не вызывается. У меня вопрос, почему «T-Plus:% d \ n» при l oop print не вызывается после функции printf ()?:

#include <stdio.h>

char getString();
void tcount(void);


int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    printf("%s", getString());

    int i = 1;
    do
    {
        printf("T-Plus: %d\n", i);
        i++;
    } while( i < 51 );
}

char getString()
{
    char name;
    printf("Please a string name: \n");
    scanf("%s", &name);
    return name;
}

Теперь, когда я его запускаю, это становится выводом:

$ ./namecount
Please a string name:
whoa

, но строка T-Plus: не вызывается.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Здесь я вижу две проблемы:

1) В функции getString() вы пытаетесь читать / сканировать строку в символе, вам нужна память для хранения строки и завершающий символ, чтобы вы могли используйте любой из этих двух способов

Используйте массив символов, например char name[50]; или

Используйте указатель на символ и выделите память, используя mallo c например char *p_name = malloc(sizeof(char)*50);

2 Затем вы пытаетесь вернуть эту строку, которая хранится в локальной переменной (которая будет уничтожена, как только функция завершится), поэтому вам следует использовать второй подход (использовать mallo c) и вернуть указатель.

Ваш код будет выглядеть так:

#include <stdio.h>
#include <stdlib.h>

char * getString();
void tcount(void);


int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    char *p_name = getString();
    printf("%s", p_name);
    free(p_name);

    int i = 1;
    do  
    {   
        printf("T-Plus: %d\n", i); 
        i++;
    } while( i < 51 );
}

char *getString()
{
    char *p_name = malloc(sizeof(char)*50);
    printf("Please a string name: \n");
    scanf("%s", p_name);
    return p_name;
}
0 голосов
/ 22 апреля 2020

Приведенный выше ответ не сработал. Хорошо, поэтому я отредактировал код следующим образом, он прекрасно компилируется. Однако возникает ошибка сегментации.

#include <stdio.h>
#include <stdlib.h>

char * getString();
void tcount(void);

int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    char *name = getString();
    printf("%s", name);
    free(name);

    int i = 1;
    do
    {
        printf("T-Plus: %d\n", i);
        i++;
    } while( i < 51 );
}


char * getString()
{
    char *p_name[50];
    printf("Please a string name: \n");
    scanf("%49s", (char *) &p_name);
    return *p_name;
}

Когда программа запускается, она запрашивает ваш ввод, но все же вызывает ошибку сегментации (ядро сброшено).

...