Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Polus
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 3
#1

Предупреждение: формат не является строковой константой, и не заданы аргументы форматирования - C++

12.04.2014, 16:14. Просмотров 341. Ответов 2
Метки нет (Все метки)

Если не считать мусор, то всё работает правильно!
Входные данные:
13:00
5
Li 13:15
Ka 14:00
lop 13:12
kir 15:54
jim 13:00
Выходные данные:
��D (мусор)
jim
lop
Li
Ka
Программа выдает два предупреждения:
main.cpp: В функции «int main()»:
main.cpp:14:34: предупреждение: format «%s» expects argument of type «char*», but argument 2 has type «char (*)[21]» [-Wformat]
main.cpp:37:23: предупреждение: формат не является строковой константой, и не заданы аргументы форматирования [-Wformat-security]

Не ясны предупреждения. Чего хочет? Как записать правильно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <cstdio>
#include <cstring>
int main()
{
    char buf[21];
    int i,j,N,time,k,t,buftime,m,p;
    m = t = 0;
    scanf("%d%*c%d",&i,&j);
    time = i*60 + j;
    scanf("%d",&N);
    char mas[N][21];
    int tim[N];
    for (i=0;i<N; i++){
    scanf("%s%d%*c%d", &buf,&t,&j);
    buftime = t*60+j;
    if(time+120>=buftime){
        tim[m] = buftime;
        strcpy(mas[m],buf);
        m++;
    }
    }
    t = 0;
    for (i=0;i<N-1; i++)
        for (j=i+1;j<N;j++)
            if(tim[i]<tim[j]){
                k = tim[i];
                tim[i] = tim[j];
                tim[j] = k;
               strcpy (buf,mas[i]);
               strcpy(mas[i],mas[j]);
               strcpy(mas[j],buf);
          }
 
 
    for (i=m; i>=0; i--){
        printf (mas[i]);
        printf ("\n");
    }
 
return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2014, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Предупреждение: формат не является строковой константой, и не заданы аргументы форматирования (C++):

Каким образом выделяется память при инициализации строковой константой указателя - C++
Доброго времени суток. Хотелось бы более подробно узнать некоторые моменты относительно указателей и динамического выделения памяти....

Является ли пример типизированной константой? - C#
Дано задание *сделать 3 множества, провести с ними некоторые операции и вывести...* При этом надо описать исходные как типизированные...

Error C2099: инициализация не является константой - C (СИ)
proc_db.h #ifndef PROC_DB #define PROC_DB FILE *fp; int errors; /*

Придать строковой переменной формат даты - VBA
нужно из строковой переменной 010203 сделать переменную в виде даты 01.02.2003. нужно не проверить (сравнить) переменную с маской, а...

Целая функция с устранимой особой точкой является константой - ТФКП
Подскажите, пожалуйста, верны ли мои рассуждения. Функция целая =&gt; функция имеет только одну особую точку в бесконечности, данная...

Проверить, заданы ли аргументы запуска бат-файла - CMD/BAT
Доброго дня. Подскажите, пожалуйста, как мне сделать, чтобы если пользователь не указал параметры (имена текстового файла и трех каталогов)...

2
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.04.2014, 16:21 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
 scanf("%s%d%*c%d", buf,&t,&j)
1
Polus
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 3
12.04.2014, 18:59  [ТС] #3
Теперь предупреждений нет (второе тоже сделал), но мусор остался. Так из-за чего он? Выхода за границы массива не вижу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <cstdio>
#include <cstring>
int main()
{
    char buf[21];
    int i,j,N,time,k,t,buftime,m,p;
    m = t = 0;
    scanf("%d%*c%d",&i,&j);
    time = i*60 + j;
    scanf("%d",&N);
    char mas[N][21];
    int tim[N];
    for (i=0;i<N; i++){
    scanf("%s%d%*c%d", buf,&t,&j);
    buftime = t*60+j;
    if(time+120>=buftime){
        tim[m] = buftime;
        strcpy(mas[m],buf);
        m++;
    }
    }
   
    t = 0;
    for (i=0;i<N-1; i++)
        for (j=i+1;j<N;j++)
            if(tim[i]<tim[j]){
                k = tim[i];
                tim[i] = tim[j];
                tim[j] = k;             
               strcpy (buf,mas[i]);
               strcpy(mas[i],mas[j]);
               strcpy(mas[j],buf);
 
                }
 
 
    for (i=m; i>=0; i--){
        printf ("%s",mas[i]);
        printf ("\n");
    }
 
 
 
 
 
 
 
    return 0;
}
Добавлено через 1 час 7 минут
Всё нашёл косяк. У меня значение m всегда опережало размер массива, поэтому в конце надо декрементировать m.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2014, 18:59
Привет! Вот еще темы с ответами:

AS 3.0 Тип не найден или не является константой времени компиляции: APIConnection - ActionScript
При компиляции ролика, выдает ошибку: Вот кусок кода, к котором находится ошибка: import flash.events.MouseEvent; import...

Как проверить, заданы ли аргументы при запуске программы? - Delphi
Как проверить, заданы ли аргументы при запуске программы?

1046: Тип не найден или не является константой времени компиляции: Void. - ActionScript
При открытии файла Action Script 2.0 во Flash 2015 CC (AS 3.0) ошибка: Символ &quot;ico two arrow&quot;, слой &quot;@&quot;, кадр 1, строка 4, столбец...

Заданы длины сторон треугольника. Определить, является ли он равнобедренным - C++
Прошу помощи! Заданы длины сторон треугольника. Определить, является ли он равнобедренным.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.