Почему <null>появляется каждый раз, когда я вызываю другую функцию? - PullRequest
0 голосов
/ 04 января 2019

Будучи новичком в программировании, я делаю много ошибок, но не могу понять совершенные указатели. Я написал код, в котором в функцию «Добавить» я добавляю данные о расписании блюд. После функции «Изменить» я хочу, чтобы мой код печатал последние добавленные данные. Но вот проблема, она печатает меня каждый раз. Вы знаете, как это исправить?

int login ( char name[50] );
void autoPass( char username[50] );
char pass[50];
int n = -1; //global counter
char *table[100][4];
void Add( int n );
void Modify( int n );

int main()
{
    char selection[7];
    printf( "\n\nChoose between: Add,Modify,View,Search,Sort,Exit\nSelection: " );
    scanf ( "%s",&selection );

    while ( ( strcmp( selection,"Exit" )  == 0 ) == 0 )
    {
        if (strcmp( selection,"Add" ) == 0 )
        {
            Add( n );
            printf( "Press any character to continue or Exit to finish.\n" );
            scanf ( "%s",&selection );
            printf( "check1" );
        }else if ( strcmp( selection,"Modify" ) == 0 )
        {
            Modify( n );
            printf( "Press any character to continue or Exit to finish.\n" );
            scanf ( "%s", &selection );
            printf( "check2" );
        }
    }
}



void Add (int n)
{
    int i,j;
    n++;
    for ( j = 0 ; j < 4 ; j++ )
    {
        if ( j == 0 )
        {
            printf ( "Enter a food:\n" );
            table[n][j] = (char*) malloc( 30 );
            scanf( "%s",table[n][j] );
        }else if (j == 1 )
        {
            printf("Enter calories:\n");
            table[n][j]=(char*) malloc(30);
            scanf("%s",table[n][j]);
        }else if ( j == 2 )
        {
            printf( "Enter the time you ate:\n" );
            table[n][j] = (char*) malloc( 30 );
            scanf ( "%s",table[n][j] );
        }else if ( j == 3 )
        {
            if (atof( table[n][j-1]) >= 5.00 && atof( table[n][j-1] ) <= 11.59 )
            {
                table[n][j] = "prwino";
            }else if( atof( table[n][j-1] ) >= 12.00 && atof( table[n][j-1] ) <= 19.59 )
            {
                table[n][j] = "mesimeriano";
            }else if ( atof( table[n][j-1] ) >= 20.00 && atof( table[n][j-1] ) <= 4.59 )
            {
                table[n][j] = "vradino";
            }
        }
    }
}

void Modify( int n )
{
    int i,j;
    for ( j=0 ; j < 4 ; j++ )
    {
       printf ( "%s",table[n][j]," " );
     }
     printf( "\n" );
 }

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

1 Ответ

0 голосов
/ 04 января 2019

Ну, похоже, у вашего кода есть некоторые проблемы.

Вы должны заменить все вызовы scanf:

scanf ( "%s",&selection );

и измените их на:

scanf ( "%s",selection ); /// Drop the &

Вам нужно отбросить &, потому что формат %s ожидает аргумент типа char*, но когда вы используете &selection, аргумент становится char (*)[7], который не char*, как вы его объявляете.

Также вы должны ВСЕГДА проверять возвращаемое значение scanf:

if ( scanf ( "%6s",selection ) != 1 ) ///notice 6 there?
{
    printf("Error, scanf()\n" );///Is there to read only 6...
    exit( EXIT_FAILURE );
}

Другая проблема внутри void Add ( int n ), там вы увеличиваете n:

n++;

Но вы также объявили n глобальным: int n = -1; //global counter

Какой n вы ожидаете увеличить?

Внутри функций modify() у вас слишком много аргументов:

printf ( "%s",table[n][j]," " );

Бросить последний " ":

printf ( "%s",table[n][j] );

В качестве предложения вы можете использовать strcasecmp вместо strcmp. Для этого вам нужно включить strings.h.

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