注:printf用的太熟悉了,懒得总结。本次主要时总结输入的方式,顺带着说一下cout。
一、scanf对空格,回车等输入的反应
1、%c:读取一个字符,包括了回车等特殊字符
所以使用%c就会出现以下情况
int a,b;
char c;
scanf("%d %d", &a, &b);
printf("a=%d b=%d\n", a, b);
scanf("%c", &c);
printf("char=%c\n", c);
11 66
a
11 66
a=11 b-66
char=
2、一次性出现很长输出时,用scanf会被等待缓存区回车打断
当你期待输入,n个数,且时一次性的用空格或其他符号间隔开时
8
11 13 34 56 22 344 222 334
int n;
int nums[n+1];
scanf("%d",&n);
for(i = 0 ; i<n;i++)
{
scanf("%d",&nums[i]);
}
系统就会只读一次,第一个其输入钱就是那一整行,但是由于有空格,nums[0]的值,可能会截断或乱掉。
总之并没有完成理想中的输入方式
2、循环输入的scanf格式和办法
#include <stdio.h>
#define MAX_LINE_LENGTH 1024
int main() {
int n;
if(scanf("%d", &n) != 1) {
printf("Invalid input for n.\n");
return 1;
}
getchar(); // Consume the newline after reading 'n'
int nums[n];
char line[MAX_LINE_LENGTH];
fgets(line, MAX_LINE_LENGTH, stdin); // Read the whole line of integers
int count = 0;
int num;
char *pch = strtok(line, " ");
while (pch != NULL && count < n) {
sscanf(pch, "%d", &num);
nums[count++] = num;
pch = strtok(NULL, " ");
}
// 检查是否成功读取了n个整数
if (count != n) {
printf("Not enough integers were provided.\n");
return 1;
}
// 可以在此处检查或打印输入的整数数组
return 0;
}
strtok
和 sscanf
都是 C 语言中的字符串处理函数,它们有不同的用途:
strtok
函数
功能:
strtok
函数主要用于将一个字符串分割成一系列标记(token),它通过查找并移除指定分隔符之间的部分来达到分割字符串的目的。
原型:
char *strtok(char *str, const char *delim);
用法:
- 第一次调用
strtok
函数时,传入要分割的原始字符串和分隔符字符串。 - 之后每次调用
strtok
时,传入NULL
和分隔符字符串即可,函数会在上次分割的基础上继续进行分割操作。 - 当找不到更多分隔符时,返回
NULL
表示到达了字符串的末尾。
pch 的作用:
在上述代码片段中,pch
是一个指向字符的指针,它被 strtok
函数更新为指向当前找到的标记(token)。在循环中,每次调用 strtok
后,pch
就指向了下一个未被分隔符隔开的部分。
例如:
char str[] = "11 13 34 56";
char *pch = strtok(str, " ");
while (pch != NULL) {
printf("%s\n", pch);
pch = strtok(NULL, " ");
}
这段代码会依次输出:
11
13
34
56
sscanf
函数
功能:
sscanf
函数是从一个字符串中读取格式化的数据,类似于 scanf
对控制台输入的操作,但它处理的是字符串而不是标准输入流。
原型:
int sscanf(const char *str, const char *format, ...);
用法:
str
是包含要分析的字符串的指针。format
是一个格式字符串,与printf
家族函数中的格式字符串类似,包含了如何解释str
中的内容的信息。- 格式字符串后面的可变参数列表是接收解析出数据的变量地址。
例如:
char input[] = "The number is 42.";
int number;
sscanf(input, "The number is %d.", &number);
printf("Number parsed from string: %d\n", number); // 输出: Number parsed from string: 42
在这个例子中,sscanf
使用 %d
格式说明符从字符串中提取了一个整数值,并将其存储到 number
变量中。
联合使用 strtok
和 sscanf
:
有时候,我们会先用 strtok
分割字符串,然后对每个分割出来的子字符串使用 sscanf
进行进一步的格式化读取。如上面讨论的例子中,先用 strtok
分割出各个整数项,然后再通过 sscanf
把这些子字符串转化为整数并存储到数组中。
二、cin循环输入的数据类型和转化
#include <iostream>
这里要挂好头文件
#include <vector>
int main() {
int n;
std::cout << "Enter the number of integers to read: ";
std::cin >> n;
使用vector容器
std::vector<int> nums(n);
注意这里是引用“&”
for(int& num : nums) {
面对空格会自动跳过
std::cin >> num;
}
// 可以在此处检查或打印输入的整数数组
for(const auto& value : nums) {
std::cout << value << ' ';
}
注意输入的结尾假std::endl
std::cout << std::endl;
return 0;
}
三、cout用法的简单概述
后面及时跟flush, endl 。
cout << “This will be immediately displayed” << flush;
或
cout << “This will be immediately displayed” << ‘\n’;