2009-11-24 3 views
-1

В цикле for я пытаюсь использовать printf для печати текущего значения i. Эта строка: printf((char *) i); дает мне ошибки времени выполнения. Почему это?!printf ((char *) i); ошибка выполнения? (i as integer)

Ниже приведен краткий FizzBuzz решение, которое делает это:

void FizzBuzz() 
{ 
    for (int i = 0; i < 20; i++) 
    { 
     printf((char *)i); 
     if ((i % 3 == 0) && (i % 5 == 0)) 
     { 
      printf("FizzBuzz \n"); 
     } 
     else if (i % 3 == 0) 
     { 
      printf("Fizz \n"); 
     } 
     else if (i % 5 == 0) 
     { 
      printf("Buzz \n"); 
     } 
     else 
     { 
      printf("%d\n", i); 
     } 
    } 
} 
+0

Для записи вместо того, чтобы делать 'if ((i% 3 == 0) && (i% 5 == 0))' вы могли бы просто сделать if if (i% 15 == 0) '. –

+0

Это правда! В этом было задумано, это был всего лишь общий пример, которым, как мы надеемся, должны быть знакомы все. – Chris

ответ

6

Потому что это не так, как printf работы. Вы хотите вместо этого:

printf("%d\n", i); 

Или еще лучше,

std::cout << i; 
+1

std :: cout << i << std :: endl; написать точный эквивалент вашей строки printf –

+0

Это определенно верно, но я получаю ошибку времени выполнения, и она ломается в dbghook.c .. – Chris

+0

Отредактируйте свой ответ с помощью своего кода. –

3

Если вы используете C++, вы должны использовать соиЬ вместо Printf:

#include <iostream> 
using namespace std; 

int main() { 
     int i = 42; 
     cout << "The answer is: " << i << endl; 
} 
+0

«использует пространство имен stdl», необходимое для cout? Сначала я попытался использовать cout, и мой компилятор не узнал его, но я исключил эту строку. – Chris

+2

Вы либо делаете «using namespace std;» или напишите «std :: cout << i << std :: endl;» вместо. Читайте о пространствах имен C++. –

2

К этому заявлению, что вы говорит: «есть стай, начинающийся в месте i, покажите его» Конечно, это не то, что вы намеревались. Используйте строку формата% D для печати целочисленного

2

Путь Printf работает так, что она принимает строку, как это:

printf("the number is: "); 

Если затем вы хотите целое число в последней части строки, необходимо использовать маскирующий, а затем передать Int в качестве другого в параметре:

printf("the number is %d", i); 

Существует больше информации here на характерах эвакуационных вы можете использовать.

Вы также должны включать в себя:

#include <stdio.h> 

EDIT

К сожалению моя терминология не так,% следует последовательность называется спецификацией преобразование не бегство characer.

HTH.

+0

'% d' - это не то, что мы обычно называем escape-символом (' \ n' и т. Д.). –

+0

да, вы правы. та. – 0xC0DEFACE

+0

Он также не называется «спецификацией преобразования», потому что ничего не преобразуется 'printf' (если вы передаете ему' char * ', и скажите, что это' int' - eg '% d' - в строке формата , вы получите UB). Он называется «спецификатором формата». –

1

Первый аргумент printf() - строка с нулевым символом в стиле C. Он предназначен для использования в качестве формата (таким образом, «f») с последовательностями форматирования % для печати оставшихся аргументов.

С помощью printf((char *) i); вы поручаете компьютеру печатать каждый байт, начиная с адреса, который i указывает на то, что он встречает нуль. К сожалению, учитывая, что i обычно используется для счетчиков, он, вероятно, указывает на очень низкую память. Большинство современных операционных систем запрещают доступ к такой памяти из программ пользовательского пространства для предотвращения ошибок в создании дыр в безопасности и отправляют сигналы на нарушительные программы. Ответ по умолчанию на такой сигнал, если вы его не ловушки, заключается в том, чтобы убить процесс.

Чтобы вместо этого отобразить номер, хранящийся в i, используйте printf("%d\n", i);. Чтобы отобразить значение i в качестве символа, попробуйте putc((char)i); или printf("%c\n", i);. Если i действительно является указателем на символ, попробуйте putc((char)(*i));.

 Смежные вопросы

  • Нет связанных вопросов^_^