простая ошибка c делает указатель из целого числа без приведения - PullRequest
3 голосов
/ 22 ноября 2010

Я взялся за изучение c с помощью книги k & r. Довольно захватывающе, но у меня рано возникли проблемы, и я не уверен, как решить проблему.

Я пробую действительно простой пример кода и получаю следующую ошибку. Я не понимаю почему, потому что код прямо из книги.

main.c:11: warning: passing argument 2 of ‘sprintf’ makes pointer from integer without a cast


#include <stdio.h>

/* copy input to output; 1st version */
main() {
    int i;
    int power(int base, int n);

    for (i = 0; i < 10; i++) {
        sprintf("%d %d %d\n", i ,power(2, i), power(-3, i));
        return 0;
    }



}

int power(int base, int n) {
    int i;
    int p;

    p = 1;

    for (i = 1; i <= n; ++i)
        p = p * base;
    return p;

}

Я был бы признателен, если бы я снова отправился в путь.

Ответы [ 6 ]

5 голосов
/ 22 ноября 2010

sprintf для создания строки на основе некоторого форматирования.Похоже, вы хотите вывод, поэтому вы хотите использовать printf.

Кроме того, return 0; не должно быть включено в ваш цикл for.Это приведет к завершению программы после одной итерации.

3 голосов
/ 22 ноября 2010

С man sprintf: int sprintf (char * str, const char * format, ...);

Первый аргумент sprintf - это строка, которую вы выделили.

Если вы хотите печатать на стандартный вывод (обычно это терминал, на котором вы запускаете программу), используйте printf.

1 голос
/ 27 марта 2014

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

for (i = 1; i <= n; ++i)
    p = p * base;    //inside
return p;            //outside because no brackets {}

и

for (i = 1; i <= n; ++i){
    p = p * base;    //inside
    return p;}       //inside because brackets {}

если вы не используете скобки в цикле или оператор if, будет выполнена только прямая следующая строка. этот возврат находится за пределами цикла

0 голосов
/ 22 ноября 2010

это просто компилятор предупреждение , но процесс должен был быть успешно завершен, если вы не получили никаких сообщений об ошибках ... Вы можете обойти предупреждение, добавив явное приведение к строке 11 .. проверьте на "приведение типа c" в Google;)

0 голосов
/ 22 ноября 2010

Первый аргумент sprintf() - это буфер, в который вы должны печатать. Второй формат строки.

(Также рассмотрите возможность использования snprintf() - гораздо проще написать безопасный код, который не переполняет буфер.)

0 голосов
/ 22 ноября 2010

sprintf() ожидает строку в качестве первого и второго аргументов.

Первый обозначает строку, в которой вы хотите сохранить результат, а второй - строку формата.

Выможет захотеть использовать printf() вместо sprintf().

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