【编程:c++基础】cin、cout、scanf总结

注: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;
}

strtoksscanf 都是 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 变量中。

联合使用 strtoksscanf
有时候,我们会先用 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’;

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值