cingetline 都是 C++ 中用于从标准输入读取数据的方式,但它们之间有一些关键的区别,主要在于它们处理输入的方式不同。下面详细说明它们的差异:

1. 读取方式

  • cin:逐个读取单个数据项(通常以空白字符作为分隔符)。比如,当你使用 cin >> s; 读取一个字符串时,它会跳过任何空格、换行符或制表符,只读取直到遇到下一个空白字符为止。

    • 示例:

      string s;
      cin >> s;
      // 输入 "hello world" 输出 s = "hello" (只读取第一个单词)
  • getline:读取一整行的输入,直到遇到换行符为止。它会将整行的内容,包括空格、制表符,作为输入的一部分。

    • 示例:

      string s;
      getline(cin, s);
      // 输入 "hello world" 输出 s = "hello world" (读取整个字符串)

2. 分隔符的处理

  • cin:使用空白字符(空格、换行符、制表符)作为分隔符。当它遇到这些字符时,读取就会结束,剩余的部分不会被读取。
  • getline:使用换行符 \n 作为分隔符。当它遇到换行符时,读取才会结束,它会读取空格和制表符,并且将它们视为字符串的一部分。

3. 空白字符的处理

  • cin:跳过空白字符。它只会读取第一个非空白字符开始的数据。
  • getline:会读取空白字符并将它们作为字符串的一部分,直到遇到换行符为止。

4. 处理换行符的区别

  • cin:读取数据后,剩下的换行符会留在输入缓冲区中,可能影响后续的输入。

    • 例如,在 cin >> n; 之后,如果使用 getlinegetline 会直接读取到那个留在缓冲区中的换行符 \n,导致行为异常。
  • getlinegetline 会消耗输入缓冲区中的换行符,并读取整行数据。

示例代码解释 cingetline 的区别:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    string s;

    // 使用cin读取一个整数
    cin >> n;  // 读取一个整数,假设输入是5,缓冲区中会留下换行符

    // 使用getline读取字符串
    getline(cin, s);  // 由于cin >> n没有消耗掉换行符,getline会直接读取这个换行符,导致s是空字符串

    cout << "n: " << n << endl;
    cout << "s: " << s << endl;

    return 0;
}

输出:

输入:
5
hello world

输出:
n: 5
s:

解释:

当使用 cin >> n; 读取整数时,输入缓冲区中会残留一个换行符 \n。随后调用 getline(cin, s) 会读取到这个换行符,因此字符串 s 将是一个空字符串。

如何解决这个问题:

在使用 getline 之前,可以先使用 cin.ignore() 来清除输入缓冲区中的换行符。

cin >> n;
cin.ignore();  // 清除缓冲区中的换行符
getline(cin, s);

总结:

  • cin:适合读取单个数据项,跳过空白字符,不能读取带空格的字符串。
  • getline:适合读取一整行数据,包括空格和制表符,遇到换行符结束。

因此,根据不同的需求选择 cin 还是 getline

在 C 语言中,abs() 是一个标准库函数,用于计算整数的绝对值。它定义在 stdlib.h 头文件中。函数的原型如下:

int abs(int x);

功能

  • 参数x 是一个整数(int 类型)。
  • 返回值:返回 x 的绝对值。如果 x 是负数,abs(x) 会返回其正值;如果 x 是正数或零,函数会直接返回 x

示例

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num1 = -10;
    int num2 = 20;

    printf("The absolute value of %d is %d\n", num1, abs(num1));
    printf("The absolute value of %d is %d\n", num2, abs(num2));

    return 0;
}

输出:

The absolute value of -10 is 10
The absolute value of 20 is 20

注意事项

  • abs() 只对整数有效。如果你想对浮点数取绝对值,应该使用 fabs(),它定义在 math.h 中,函数原型为:
double fabs(double x);

总的来说,abs() 是一个常用的、计算整数绝对值的函数,适用于多种场景。

【深基2.例12】上学迟到

题目描述

学校和 yyy 的家之间的距离为 $s$ 米,而 yyy 以 $v$ 米每分钟的速度匀速走向学校。

在上学的路上,yyy 还要额外花费 $10$ 分钟的时间进行垃圾分类。

学校要求必须在上午 $\textrm{8:00}$ 到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。

由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。

输入格式

一行两个正整数 $s,v$,分别代表路程和速度。

输出格式

输出一个 $24$ 小时制下的时间,代表 yyy 最晚的出发时间。

输出格式为 $\texttt{HH:MM}$,分别代表该时间的时和分。必须输出两位,不足前面补 $0$。

样例 #1

样例输入 #1

100 99

样例输出 #1

07:48

提示

对于 $100\%$ 的数据,$1 \le s,v \le 10^4$。

题解 :

#include<bits/stdc++.h>

using namespace std;

  

int main() {

    double s ,v ,m,t;

    int h;

    scanf("%lf %lf",&s,&v);

    t = s/v + 10;

    h = t / 60;

    m = ceil(t - h*60);

    int mm = (int)m;

    if (mm == 0) printf("%02d:%02d",8 - h,mm);

    else if (mm == 60) printf("%02d:00",7 - h);

    else {

        h = 7 - h;

        mm = 60 - mm;

        if (h < 0) printf("%02d:%02d",h + 24,mm); //当h<0说明就是前一天就出发了,提前的时间超过8h

        else printf("%02d:%02d",h,mm);

    }

    return 0;

}

这题的两个坑就是 1、因为是向上取整用的ceil(),所以当m 是59.5,这样的数时,m会取整为60,这个时候就是要让他变成0,然后小时数减1,第二个坑就是h有可能算出来是负的,因为有可能提前的时间超过了8小时,这个时候就是给他加上24小时,相当于就是24小时去减,变成前一天的出发时间。

要对浮点数进行类似取模的操作,你可以使用math.h库中的fmod函数,它专门用于浮点数的取模运算。

代码如下:

#include <math.h>

m = ceil(fmod(t, 60));

这样,fmod(t, 60)会返回t除以60后的余数,然后再用ceil函数取整。