我明白,问题,如,差异endl和\n已经多次回答SO.但是他们只提到endl能够将缓冲区冲到上面stdout,而\n不是.
因此,我通过刷新缓冲区理解的是,给定的输入存储在一个缓冲区中,并且stdout仅在它遇到endl时或者一些明确的flush函数传递给它.如果是这样,我预计以下代码:
#include <iostream>
#include <unistd.h>
int main(void)
{
std::cout << "Hello\nworld";
sleep(2);
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显示:
2秒后
Hello
World
Run Code Online (Sandbox Code Playgroud)
但实际产量是:
Hello
Run Code Online (Sandbox Code Playgroud)
2秒后
World
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
也不\n应该存储在缓冲区中,只有在endl遇到缓冲区时才会被刷新/显示在上面stdout,但是从我观察到的\n是同样的行为endl.
我刚刚开始学习C中的文件处理,并想知道我是否可以通过读取文件的输入来执行数学计算,这里是只读取字符并在控制台上显示的代码:
int main(void)
{
FILE *p;
char a, b, c, ch;
p = fopen("numbers.txt", "a+");
while((ch = getc(p)) != EOF)
{
fscanf(p, "%c %c %c\n", &a, &b, &c);
printf("%c %c %c\n", a, b, c);
}
fclose(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
numbers.txt包含(每个字符前有一个空格):
2 + 3
5 + 6
6 + 7
Run Code Online (Sandbox Code Playgroud)
获得的输出是:
2 + 3
+ 6
+ 7
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么第一行输出符合预期,但第二行和第三行缺少字符,即使在numbers.txt中的每个表达式之后给出了新行.
下面的代码片段没有给出编译错误,但它也没有给出预期的输出,虽然这可以用简单的if-else方式完成,但我想用宏来做.这c是一个字符变量.
#define VOWELS 'a' || 'e' || 'i' || 'o' || 'u' || 'A' || 'E' || 'I' || 'O' || '
if (c == VOWELS) {
printf("vowel = %c\n", c);
}
Run Code Online (Sandbox Code Playgroud) 我来自C背景,在学习C++时我遇到了<string>头文件.在C字符串中,将是一个以字符结尾的字符数组'\0'.
但是,在std::string我发现情况并非如此,并且在任何有效索引处插入/替换空字符时,不会像我期望的那样修剪字符串.
string s;
getline(cin, s);
// remove all punctuation
for(string::size_type i = 0, n = s.size(); i < n; i++)
{
if(ispunct(s[i]))
s[i] = '\0';
}
Run Code Online (Sandbox Code Playgroud)
输入:你好,世界!!!!
输出:Hello World
预期产量:你好
在观察上述行为时,我假设C++中的字符串不是空终止的.然后我发现这个问题在字符串中使用空字符(C++)这让我感到困惑.
string s = "Hello\0, World";
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)
输出:你好
预期产量:你好,世界
如果有人能解释这种行为背后的原因,将会有所帮助.
spring如何在内部管理这些对象?
什么时候创建和销毁单例对象?