C++ printf((char*)i);运行时错误?(i作为整数)

C++ printf((char*)i);运行时错误?(i作为整数),c++,runtime-error,C++,Runtime Error,在for循环中,我尝试使用printf打印当前的I值。此行:printf((char*)i)给了我运行时错误。这是为什么 下面是一个快速的fizzbuzz解决方案: void FizzBuzz() { for (int i = 0; i < 20; i++) { printf((char *)i); if ((i % 3 == 0) && (i % 5 == 0)) { printf("

在for循环中,我尝试使用printf打印当前的I值。此行:
printf((char*)i)给了我运行时错误。这是为什么

下面是一个快速的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);
        }
    }
}
void FizzBuzz()
{
对于(int i=0;i<20;i++)
{
printf((char*)i);
如果((i%3==0)和&(i%5==0))
{
printf(“FizzBuzz\n”);
}
如果(i%3==0),则为else
{
printf(“Fizz\n”);
}
else如果(i%5==0)
{
printf(“Buzz\n”);
}
其他的
{
printf(“%d\n”,i);
}
}
}

因为这不是
printf
的工作方式。您希望这样做:

printf("%d\n", i);
甚至更好

std::cout << i;

<代码> STD::CUT

如果您使用C++,则应该使用CUT代替PROTF:

#include <iostream>
using namespace std;

int main() {
        int i = 42;
        cout << "The answer is: " << i << endl;
}
#包括
使用名称空间std;
int main(){
int i=42;

cout根据这句话,您要说的是:“有一个从位置i开始的刺痛,显示它”这肯定不是您想要的。使用格式字符串%d打印一个整数

printf( "the number is: " );
如果要在字符串的最后一部分使用整数,则需要使用转义字符,然后将int作为另一个参数传入:

printf( "the number is %d", i );
有关可以使用的转义字符的详细信息

您还需要包括:

#include <stdio.h>
#包括
编辑

很抱歉,我的术语错误,%后跟一个序列称为转换规范,而不是转义字符


HTH.

printf()
的第一个参数是一个C样式的以空结尾的字符串。它是用来作为一种格式(即“f”)使用
%
格式序列来打印其余的参数

通过使用
printf((char*)i)
您指示计算机打印从
i
指向的地址开始的每个字节,直到它遇到空值。不幸的是,鉴于
i
通常用于计数器,它可能指向非常低的内存。大多数现代操作系统禁止从用户空间程序到预处理程序访问此类内存通过设置安全漏洞来释放bug,并将向有问题的程序发送信号。除非捕获该信号,否则对该信号的默认响应是终止进程


要显示存储在
i
中的数字,请使用
printf(%d\n,i);
。要将
i
的值显示为字符,请尝试
putc((char)i);
printf(%c\n,i);
。如果
i
确实是指向字符的指针,请尝试
putc((char)(*i));
/p>是“使用命名空间stdl”cout需要?我最初尝试使用cout,但我的编译器无法识别它,但我排除了该行。您可以使用“使用命名空间std;”或编写"std::cout std::cout这肯定是正确的,但我还是得到了一个运行时错误,它在dbghook.c中出现了。std::cout并不比printf好。只是不同。奇怪,另一个Chris对此发表了评论,哈哈。我用代码编辑了我的问题。
std::cout
是类型安全的,除非你通过一个真正的p,否则不会用segfaults打断你ointer(而
printf
如果写入格式字符串不正确,则会中断)。
%d
不是我们通常称之为转义字符(
\n
等)。它也不称为“转换规范”,因为
printf
不会转换任何内容(如果你给它传递一个
char*
,并告诉它是一个
int
——例如格式字符串中的
%d
,你将得到U.B.)。它被称为“格式说明符”。我在麻省理工学院的一些课程笔记上的链接称之为转换规范,这听起来不错。无论如何,它肯定不是转义字符!作为记录,与其做
if((i%3==0)&&(i%5==0))
不如做
if(i%15==0)
。这是真的!0考虑到这一点,这只是一个大家都应该熟悉的通用示例。