2015-12-02 4 views
-2

творю строку, используя snprintf():Объединение строк с использованием snprintf

snprintf(msgText, MAX_MSG_SIZE-1, "expr $((($(date +%s) - $(date +%s -r filename.txt))/86400))"); 

Это предназначено для хранения команды Linux в msgText. Команда будет выполнена позже и выведет возраст filename.txt в днях.

Проблема состоит в следующем:

Это не так, как snprintf ожидает %s иметь строковый аргумент. Компилятор сообщает об этой ошибке:

error: format ‘%s’ expects a matching ‘char *’ argument 

Что мне делать?

+3

Возможно прочитать страницу руководства и избежать% –

+1

Или просто используйте 'strncpy()', так как 'sprintf()' предназначен для форматирования строки, которую вы здесь не делаете. –

+0

Будьте осторожны с 'strncpy()'; он не гарантирует нулевое завершение. Но я согласен с тем, что использование 'snprintf()' для выполнения простой строковой копии немного переборщило. –

ответ

2

Если вы хотите заменить %s, укажите const char* аргументы snprintf со значением для записи.

Если вы хотите буквальный %s в msgText, то либо спасаясь от %, как %% или передать строку в качестве единственного аргумента в формате строку "%s":

snprintf(msgText, MAX_MSG_SIZE-1, "%s", "$(date +%s) ..."); 
1

Вы не должны быть ссылающимся оболочки и два процесса date для чего-то простого. Вы должны просто stat() файл и вычесть его время изменения от текущего времени в C:

#include <time.h> 
#include <unistd.h> 
#include <sys/stat.h> 

double age(const char *path) { 
    struct stat buf; 

    if (stat(path, &buf)) { 
     perror("stat"); 
     return -1; 
    } 

    time_t now = time(NULL); 
    if (time < 0) { 
     perror("time"); 
     return -1; 
    } 

    return difftime(now, buf.st_mtime)/86400; 
} 

Программа испытаний может быть очень простой:

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    while (*++argv) 
     printf("%s: %.0f days\n", *argv, age(*argv)); 
} 
Смежные вопросы