输入输出

续行符

  • 宏定义只能在一行内完成
  • 字符串多行书写有两种规则:在字符串换行处加一个反斜杠\,下一行前不能有空格或者Tab键;使用双引号。
  • 代码中的“\”是 C 语言中的续行符语法,表示续行符的下一行与续行符所在的代码是同一行,因为宏定义关键字“#define”只是对当前行有效,所以使用续行符来连接
  • 应用续行符的时候要注意,在“\”后面不能有任何字符(包括注释、空格),只能直接回车。在要强制换行的地方输入反斜杠然后回车
  • c语言中还有一种拆分字符串的方法,那就是将其写个多个相邻的字符串。这些字符串之间用0个或者多个空白、制作符以及换行符隔开。 printf("Programming" " in c" " is fun"\n);//Programing in c is fun
1
2
3
4
5
6
7

printf(
" ********\n"
" ************\n"
" ####....#.\n"
" #..###.....##....\n"
);

输入输出

  • gets()函数并不读取换行符’\n’,它会吧换行符替换成空字符’\0’,作为c语言字符串结束的标志.此时换行符已经没了!!
  • gets在C99标准中,已经不再建议使用gets()函数,而在C11中更是直接抛弃了这个函数,gets函数没有限制读入的个数,这很可能会导致程序向未知的内存空间写入数据,而导致程序出错。
  • fgets函数中第二个参数限制了读取的个数,这也解决了gets函数存在的问题,但要注意fgets函数只会读取n-1个字符(如果遇到换行符会更少),并在最后添加字符串结束标志,而且,fgets也会将换行符读入。
    char *fgets(char *buf, int bufsize, FILE *stream);注意一下第二个参数bufsize,这个参数就限制了读取的字符的个数,这就可以解决gets()函数的缺陷。我们知道fgets() 函数主要用于读取文件,如果要读取键盘,则stream参数应该为stdin,需要注意的是,如果bufsize设置为n,那么fgets()函数最多读取n-1个字符,之所以用“最多”这个词是因为,如果在之前遇到了换行符,fgets函数也会返回。还有一点就是,fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束.
  • scanf函数要实现修改变量值的功能,传地址就相当于传指针(指向一个内存位置)!
    printf只是对变量值执行输出功能,不涉及改变!

输入输出返回值

  • scanf为函数,printf为函数(输入与输出函数):返回值:scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。
    如果输入数据与指定格式不符,则会产生输入错误。遇到输入错误,scanf函数会立即终止,返回已经成功读取的数据的个数。所以通过scanf函数的返回值和指定输入数据的个数(由格式符决定)的比较,可以判断数据输入是否成功。

  • scanf 函数是有返回值的,它的返回值可以分成三种情况

  • 正整数,表示正确输入参数的个数。例如执行 scanf(“%d %d”, &a, &b);

    如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
    如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。 
    
  • 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入”,3 4”,返回0。如果它没有读取任何项目(当它期望一个数字而你键入的却是了一个非数字的字符或者字符串就会发生这种情况),scanf()返回值0。当它检测到“文件结尾”(end of file)时,它就返回EOF(EOF是文件stdio.h中定义的特殊值-1)

  • EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束(scanf遇到格式不对返回EOF或结束时)(EOF == end of file)

  • ~是按位取反,scanf的返回值是输入值的个数,如果没有输入值就是返回-1
    ,-1按位取反结果是0,while(~scanf(“%d”, &n))就是当没有输入的时候退出循环

  • printf的返回值是输出的字符数,例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。不知道有木有这样写的习惯while (~scanf("...."))。这里出现了~这个符号,这个是位运算取反的意思。因为~(n)=-(n+1)。所以这里scanf的返回值为-1时~(-1)=0才退出循环。这就是这样写的意思。

c++输入输出

  • cout在输出很大的数时,会用科学计数法输出,若不想如此输出,可将原来输出数double类型与float类型改为int类型,或者如下.
  • cout<<std::fixed<< a <<endl;
  • printf("%.0lf", a);
  • 当数字过大时可能数字有变化或丢失(自测)
  • fixed后面还可以加格式控制符控制位数,setprecision(n)——设置输出浮点数的精度,配合fixed设定,指的是小数位数,设置setprecision(0)即指输出不带小数位的int值。
  • 还有其它方法!!!

  • >>运算符返回左边的流对象,也就是说 cin>>val 返回 cin,于是 while(cin>>val) 就等于是 while(cin)

cin与scanf

  • scanf是标准输入流,没有缓存区,需要预先分配空间,而cin是输入流,它使用了缓冲区。如果要使用scanf读入字符串,那就一定要事先为它申请足够的内存空间

getline函数

C++中有两个getline函数

  • 1.一个是在string头文件中,定义的是一个全局的函数,函数声明是
    • istream& getline ( istream &is , string &str , char delim );
      istream& getline ( istream& is, string& str);
      • is 进行读入操作的输入流
      • str 存储读入的内容
      • delim 终结符
    • 对于第一个函数delim是可以由用户自己定义的终结符;对于第二个函数delim默认为 ‘\n’(换行符)。
    • 在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。
    • 这个getline是个全局函数,而不是istream/iostream的成员函数getline。
  • 2. 另一个则是istream的成员函数,函数声明是
    • istream& getline (char* s, streamsize n )
    • istream& getline (char* s, streamsize n, char delim );
    • 注意这个getline是将读取的字符串存储在char数组中而不可以将该参数声明为string类型,因为C++编译器无法执行此默认转换。!
    • 输入过程中达到n个数或者提前遇到delim,或者文件结束,输入结束
  • 下面看看就行,待续

1、getline读取换行符 并且将换行符替换成’\0’,并且会丢弃换行符,对于getline函数,在函数遇到和结束定界符相等的字符时函数结束,同时函数抽出定界符,此种情况下该定界符既不被放回输入流,也不被放入要生成的字符串

2、cin会把换行符留在输入队列中

3、cin.getline读取换行符并替换成’\0’,并且不会主动丢弃换行符,会把它留在输入队列中

c++cout

1
2
3
4
5
6
7
8
9



cout << "a - b = " << stringSubString(a, b) << endl
<< "a * b = " << stringMultString(a, b) << endl
<< "a / b = " << stringDivString(a, b) << endl
<< "a % b = " << stringModString(a, b) << endl
<< "gcd(a, b) = " << stringGcd(a, b) << endl
<< "lcm(a, b) = " << stringLcm(a, b) << endl;

输出结果

  • 如果遇到 #INF / inf,就检查是否发生了运算结果溢出除零,而遇到 #IND / nan,就检查是否发生了非法的运算。
  • nan意思未not a number
  • inf: infinite,无限大

    输出补零

printf

printf("0m%d");

cout

  • 输出前面补零,头文件#include <iomanip>, cout << setw(3) << setfill('0') << a << endl;默认右对齐(数字在右边)
  • setfill('c')c为补充的字符,cout << setiosflags(ios::left) << setfill('#') << setw(5) << 123 << endl;右端补齐#,123##
  • cout << setiosflags(ios::fixed) << setprecision(2) << a << endl;控制小数点后精度,小数点后四舍五入,无则补零
------ The Happy Ending ------