Я новичок в C, тестирую код и пытаюсь использовать функции - PullRequest
0 голосов
/ 10 декабря 2018

Это код, но я получаю ошибки, слишком мало аргументов в реальном времени и ожидаемое выражение перед символом.

Я пытаюсь написать метод, затем передать информацию (вход) через метод и получить значение(вывод)

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



char realtime(char input[20], char output[25]){

    //char input[20];
    //char output [25];
    char year[5];
    char month[3];
    char day[3];
    char hour[3];
    char min[3];
    char sec[3];
    strncpy(year, input, 4);
    year[4] = '\0';
    strncpy(month, input + 4, 2);
    month[2] = '\0';
    strncpy(day, input + 6, 2);
    day[2] = '\0';
    strncpy(hour, input + 8, 2);
    hour[2] = '\0';
    strncpy(min, input + 10, 2);
    min[2] = '\0';
    strncpy(sec, input + 12, 2);
    sec[2] = '\0';
    sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
    return 0;
}

int main(){
    char input = "20181204193456";
    realtime( char input[20], char output[25]);
    printf("Parsed Date %s", output);
}

Ответы [ 6 ]

0 голосов
/ 10 декабря 2018

Вам нужно определить переменную в main для хранения вывода, а определение и вызов в реальном времени неверны.Может быть, это будет работать лучше:

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

char realtime(char *input, char *output){

    //char input[20];
    //char output [25];
    char year[5];
    char month[3];
    char day[3];
    char hour[3];
    char min[3];
    char sec[3];
    strncpy(year, input, 4);
    year[4] = '\0';
    strncpy(month, input + 4, 2);
    month[2] = '\0';
    strncpy(day, input + 6, 2);
    day[2] = '\0';
    strncpy(hour, input + 8, 2);
    hour[2] = '\0';
    strncpy(min, input + 10, 2);
    min[2] = '\0';
    strncpy(sec, input + 12, 2);
    sec[2] = '\0';
    sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
    return 0;
}

int main(){
    char input[] = "20181204193456";
    char output[25];

    realtime(input, output);
    printf("Parsed Date %s", output);

    return 0;
}
0 голосов
/ 10 декабря 2018

Прежде всего, в вашей функции main вы объявляете и инициализируете:

char input = "20181204193456";

В C тип char равен 1 байту.Строки в C представлены массивами символов.Поэтому вам потребуется:

char input[15] = "20181204193456";

Хотя в строке всего 14 символов, вам нужно 15, потому что в C каждая строка должна заканчиваться 0байт.Это делается автоматически в этом случае.Другой способ будет:

char input[] = "20181204193456"

В этом случае компилятор определит, сколько места вам нужно.

Далее, ваш вызов функции неверен:

realtime( char input[20], char output[25]);

При вызове функции вы должны использовать только имена параметров, а не их типы, например:

realtime(input, output);

Учитывая, что output не объявлено, вам сначала нужно объявить его.Рабочий код выглядит следующим образом:

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



char realtime(char input[20], char output[25])
{
    char year[5];
    char month[3];
    char day[3];
    char hour[3];
    char min[3];
    char sec[3];
    strncpy(year, input, 4);
    year[4] = '\0';

    strncpy(month, input + 4, 2);
    month[2] = '\0';
    strncpy(day, input + 6, 2);
    day[2] = '\0';
    strncpy(hour, input + 8, 2);
    hour[2] = '\0';
    strncpy(min, input + 10, 2);
    min[2] = '\0';
    strncpy(sec, input + 12, 2);
    sec[2] = '\0';
    sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);

    return 0;
}

int main()
{
    char input[15] = "20181204193456";
    char output[25];
    realtime(input, output);
    printf("Parsed Date %s", output);
}
0 голосов
/ 10 декабря 2018
char input = "20181204193456";

недействительно.Это одиночный символьный ввод, который инициализируется содержимым указателя, который указывает на строковый литерал "20181204193456".Это не то, что вы хотите.Вы хотите:

char input[] = "20181204193456";

Это символьный массив (читаемый как: 'string'), который инициализируется содержимым строкового литерала "20181204193456".Длина массива включает в себя символ завершения на конце, но без указания размера [] мы оставили его автоматически определяемым компилятором.

realtime(char input[20], char output[25]);

Это неверно и недопустимо.Вы хотите:

char outout[25];
realtime(input, output);

Сначала вы хотите зарезервировать 25 символов выходного пространства, чтобы иметь что-либо для записи.Затем вы хотите запустить функцию с первым входным параметром, а вторым - с выходным.

После исправления таких ошибок все будет в порядке.

Однако:

sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);

в порядке, но лучше использовать snprintf:

snprintf(output, 25, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);

Без 25 и snprintf, если длинаслучайно дольше это приведет к записи за размер массива.Здесь это может показаться избыточным, но лучше использовать его везде.

strncpy(arr, ..., len - 1)
arr[len] = '\0'
sprintf(... "%s", arr);

все в порядке.Но вы можете просто:

strlcpy(arr, ..., len)
sprintf(... "%s", arr);

или даже лучше:

sprintf(... "%.*s", len, arr);

, поэтому вся функция просто:

char realtime(char input[20], char output[25]){
    snprintf(output, 25, "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s", 
         input, input + 4, input + 6, 
         input + 8, input + 10, input + 12);
}
0 голосов
/ 10 декабря 2018

Объявите массивы input и output глобально, чтобы вы могли использовать их в методах (или) функциях.Как то так,

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

char realtime(char input[20], char output[25]){

    //char input[20];
    //char output [25];
    char year[5];
    char month[3];
    char day[3];
    char hour[3];
    char min[3];
    char sec[3];
    strncpy(year, input, 4);
    year[4] = '\0';
    strncpy(month, input + 4, 2);
    month[2] = '\0';
    strncpy(day, input + 6, 2);
    day[2] = '\0';
    strncpy(hour, input + 8, 2);
    hour[2] = '\0';
    strncpy(min, input + 10, 2);
    min[2] = '\0';
    strncpy(sec, input + 12, 2);
    sec[2] = '\0';
    sprintf(output, "%s-%s-%sT%s:%s:%s", year, month, day, hour, min, sec);
    return 0;
    }
int main(){
    //char input = "20181204193456";

    char input[20] = "20181204193456";
    char output[20];      

    realtime( input, output);
    printf("Parsed Date %s", output);
}
0 голосов
/ 10 декабря 2018

Вы не можете присвоить строковый литерал массиву символов вроде этого.Вместо этого:

char input = "20181204193456";

вы должны сделать это:

char input[20];
strcpy(input, "20181204193456");

Кроме того, этот вызов здесь:

realtime( char input[20], char output[25]);

Это просто копия функцииподпись.Вместо этого сделайте следующее:

realtime(input, output);

Вам также необходимо определить output заранее.В общем, ваша main функция должна выглядеть так:

int main() {
    char input[20];
    strcpy(input, "20181204193456");
    char output[20];
    realtime(input, output);
    printf("Parsed Date %s", output);
    // depending on the system, maybe wait for user input or pause here so the window doesn't immediately close
    return 0;
}

Также обратите внимание на добавленный return 0;, указывающий на успешное выполнение программы.

Конечно, это также можно сделать полностьюбез input путем непосредственной передачи строкового литерала функции:

int main() {
    char output[20];
    realtime("20181204193456", output);
    printf("Parsed Date %s", output);
    return 0;
}
0 голосов
/ 10 декабря 2018

Вы определяете символ, а не строку.Так что попробуйте:

 char input[20] = "20181204193456";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...