为什么我们不在C++中使用PROTF和SCANF?

为什么我们不在C++中使用PROTF和SCANF?,c++,C++,可能重复: < C++ >为什么我们要进行CUT和CIN < /P> < P>因为类可以超载插入操作符因为类可以过载插入操作符旧的STDIO功能是C++的兼容性,部分原因是原来的C++ cFor只是C的预处理器,所以它们还是可用的。 < > C++中发现的新I/O模型更灵活,允许您随意添加类型,可以按该类型定义的方式打印。 换句话说,以面向对象的方式 就像复数或有理数、地址簿条目、字典条目或任何其他非基本类型都应该包含在一个知道如何与基础语言分开添加、减去或以其他方式操作它们的类中一样,这些对

可能重复:


< C++ >为什么我们要进行CUT和CIN < /P> < P>因为类可以超载插入操作符

因为类可以过载插入操作符

旧的STDIO功能是C++的兼容性,部分原因是原来的C++ cFor只是C的预处理器,所以它们还是可用的。 < > C++中发现的新I/O模型更灵活,允许您随意添加类型,可以按该类型定义的方式打印。 换句话说,以面向对象的方式

就像复数或有理数、地址簿条目、字典条目或任何其他非基本类型都应该包含在一个知道如何与基础语言分开添加、减去或以其他方式操作它们的类中一样,这些对象的打印也应该留给类

如果你担心C++方式的冗长,没有什么阻止你添加一个FMT方法,返回一个字符串到你自己的数据类型来解决这个问题,比如:

std::cout << name.fmt('left',15)   // [Pax Diablo     ]
          << " " << age.fmt(4)     // [  45]
          << " " << score.fmt(3,2) // [100.00]
          << std::endl;
尺寸和/或理由

它更多的是你在类中的编码,但是如果你真的反对setfill和setw的东西,它是一个选项

然而,如果你聪明的话,几乎可以肯定的是,对于每种类型的输出,你的格式化代码都会在一个函数中,所以它会被隔离在一个区域中。我只是吸取了它,学习C++的做事方式。

< P>旧的STDIO功能是C++中的兼容性,部分原因是原来的C++ cF锋只是C的预处理器,所以它们还是可用的。 < > C++中发现的新I/O模型更灵活,允许您随意添加类型,可以按该类型定义的方式打印。 换句话说,以面向对象的方式

就像复数或有理数、地址簿条目、字典条目或任何其他非基本类型都应该包含在一个知道如何与基础语言分开添加、减去或以其他方式操作它们的类中一样,这些对象的打印也应该留给类

如果你担心C++方式的冗长,没有什么阻止你添加一个FMT方法,返回一个字符串到你自己的数据类型来解决这个问题,比如:

std::cout << name.fmt('left',15)   // [Pax Diablo     ]
          << " " << age.fmt(4)     // [  45]
          << " " << score.fmt(3,2) // [100.00]
          << std::endl;
尺寸和/或理由

它更多的是你在类中的编码,但是如果你真的反对setfill和setw的东西,它是一个选项


然而,如果你聪明的话,几乎可以肯定的是,对于每种类型的输出,你的格式化代码都会在一个函数中,所以它会被隔离在一个区域中。我只是吸取教训,学习C++的做事方式。

C++语法应该更容易,但坦白说,我从来没有采用过。此外,我做的是Windows编程,而不是控制台,所以cout和printf都没有多大用处。但是Spavtf和它的变体是.< /P> < P> C++语法应该更容易,但是坦白说,我从来没有采用过。此外,我做的是Windows编程,而不是控制台,所以cout和printf都没有多大用处。但是sprintf和它的变体是。你可以使用它们

但主要问题是它们并不安全。 很多C代码都有问题,因为格式说明符与参数不匹配,导致崩溃等

// Example
char c;
scanf("%s",&c);  // quite an easy mistake. Usually leads to a crash or something worse.
<> P> C++的变体是安全的,因为编译器保证在编译时输入的类型是正确的类型,运行时执行实际移动数据的工作。p>

第二个原因是,在C++操作符>中定义输出函数要容易得多,而可以使用它们。 但主要问题是它们并不安全。 很多C代码都有问题,因为格式说明符与参数不匹配,导致崩溃等

// Example
char c;
scanf("%s",&c);  // quite an easy mistake. Usually leads to a crash or something worse.
<> P> C++的变体是安全的,因为编译器保证在编译时输入的类型是正确的类型,运行时执行实际移动数据的工作。p>

第二个原因是,在C++操作符>和<>中定义输出函数要容易得多,同时也有能力为您选择的类超载插入和提取操作符,CIN和CUT是类型安全的,SCANF和PrTNF不是,例如,转换格式与printf的实际类型之间的不匹配非常常见:

printf("%d\n", 1.0);
printf("%f\n", 1);

这两者都不可能产生有用的输出。

除了能够为您选择的类重载插入和提取运算符外,cin和cout都是类型安全的,而scanf和printf则不是。例如,转换格式与printf的实际类型之间的不匹配相当常见:

printf("%d\n", 1.0);
printf("%f\n", 1);

这两种方法都不可能产生有用的结果。

我们会,只是不要告诉任何人…:@呃,普里扬克,请允许我欢迎你来到斯塔克
请记住我们通常在这里做的三件事:1.当你收到帮助时,尽量给予帮助,回答你专业领域的问题2.阅读常见问题解答!!3当你看到好的问题和答案时,使用灰色三角形向上投票,因为系统的可信度是基于用户通过分享知识而获得的声誉。另外,请记住,如果有更好的解决问题的答案,请按复选标记signDuplicate of。事实上,即使在C语言中使用scanf通常也是一个坏主意,除非您完全控制输入。我们这样做,只是不告诉任何人…:@Priyank请允许我欢迎您加入Stack Oveflow,并记住我们通常在这里做的三件事:1.当您收到帮助时,尝试给予帮助,回答您专业领域的问题2.阅读常见问题!!3当你看到好的问题和答案时,使用灰色三角形向上投票,因为系统的可信度是基于用户通过分享知识而获得的声誉。另外,请记住,如果答案能更好地解决您的问题,请按复选标记signDuplicate of。事实上,即使在C语言中使用scanf通常也不是一个好主意,除非您完全控制输入。我喜欢答案的第二部分。聪明这也意味着你不能把事情搞砸!编译器要么在答案的第二部分找出我喜欢的运算符。聪明这也意味着你不能把事情搞砸!编译器要么找出您可能希望查看其他流输出函数的运算符。这样,你就得到了一个更强大、更可扩展的sprintf,没有人能称你为勒德主义者。来吧,加入我们吧:-我已经做了足够长的开发人员,知道我喜欢使用什么,不喜欢什么。也许你想看看其他流输出函数。这样,你就得到了一个更强大、更可扩展的sprintf,没有人能称你为勒德主义者。来吧,加入我们:-我已经做了足够长的开发人员,知道我喜欢使用什么和不喜欢什么。