算法笔记-输入输出总结

本文介绍了C++中常用的输入输出函数,如scanf、printf、fgets、getchar等,以及它们在处理不同数据类型和格式上的使用方法,帮助程序员提高解题效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对《算法笔记》一书中的内容进行整理,方便自己复习,如果想详细阅读相关内容,推荐阅读《算法笔记》

1. 输入输出

 在算法题目中,我们经常需要自己处理输入输出。因此,掌握常用的输入输出方法利于方便的处理问题,将精力聚焦在题目具体的逻辑上,从而更利于解题。下面介绍常用的输入输出函数。

1.1 scanf()读取输入

 scanf()函数在c和cpp中均有很广泛的应用场景,一般情况下,使用scanf比单纯的使用cin要快一些,而且由于scanf具有的格式化输入,使得其应用场景更加广泛。
格式: scanf("格式控制",变量地址)
 1. scanf的双引号内的内容就是整个输入,只需要将数据换成对应的格式符并将变量地址按次序写在后面即可。

// 测试 13:45:20这种 hh:mm:ss 格式的输入
void test1(){
    int hh, mm, ss;
    scanf("%d:%d:%d",&hh,&mm,&ss);
    cout << hh <<":" << mm << ":" << ss << endl;
    printf("%d:%d:%d",hh,mm,ss);
}
  1. 除了 %c 读入字符外,scanf对其余格式的输入以空白符(即空格、换行)为结束的标志,会跳过空格,因此scanf读取输入空格可以省略。
// 测试 "3 4" scanf读取输入时中间空格可以省略。
void test2(){
    int a,b;
    scanf("%d%d",&a,&b);
    cout << a << b << endl;
}
  1. scanf的 %c 格式可以读取空格和换行。如果想读取带有空格的一行内容,使用fgets读取,但注意fgets不会删除行末的回车字符。
// 使用fgets读取包含空格的一整行内容,fgets(str,100,File*),这里可以从stdin读入。
void test3(){
    char str[100];
    fgets(str,100,stdin);
    fputs(str,stdout);
}
  1. 数组名称代表数组第一个元素地址,不需要再加取地址符号。

1.2 printf

  printf和scanf通常配套使用。这里对其常用方法进行总结。

  1. double类型的输出,格式为%f, scanf读取输入为%lf.
#include <iostream>
int main(){
	double d1 = 8765.4, d2 = 8765.4
	printf("%f\n",d1*d2);
	return 0;
}
  1. printf中可以使用转义字符,所以想输出%或,需要在前面再加一个%或\.
  2. %0md:使不足m位的int变量以m位进行右对齐输出,其中高位用0补齐,若本身超过m位,则保持原样。
/*
	%md:使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐,超过m位保持原状。
*/
#include <iostream>
int main(){
	int a = 123, b = 1234567;
	printf("%05d\n",a);
	printf("%05d\n",b);
	return 0;
}
/*
	00123
	1234567
*/
  1. %.mf:使浮点数保留m位小数输出。
#include <iostream>
int main(){
	double d1 = 12.3456;
	printf("%.0f\n",d1); // 12
	printf("%.1f\n",d1); // 12.3
	printf("%.2f\n",d1); // 12.34
}

2.字符数组的初始化与输入输出

2.1 字符数组的初始化

 字符数组的初始化方式有两种,一种是同普通数组初始化一样通过大括号枚举元素进行初始化,另一种是通过字符串对字符数组进行初始化。

// 字符数组的初始化
void test1(){
    // 1. 大括号枚举方式初始化
    char str1[20] = {'H','e','l','l','o'};
    printf("%s\n",str1);

    // 2. 字符串赋值初始化
    char str2[20] = "Hello str2";
    puts(str2);

    cout << "使用cout 输出字符数组 " << endl;
    cout << "str1 = " << str1 << endl;
    cout << "str2 = " << str2 << endl;
}

2.2 字符数组的输入与输出

2.2.1 字符数组的输入

同普通变量的输入输出一样,字符数组的输入输出也有多种方式,以下对字符数组常用的输入方式进行总结。

1. scanf()

scanf("%s",str):使用%s读入字符串存入字符数组中,以换行和空格作为输入结束的标识。此时不需要加&
scanf("%c",&str):使用%c读入单个字符,%c可以识别空格和换行并将其输入。

// 字符数组的输入scanf:以换行和空格作为结束输入的标识。
void test2(){
    char str1[20];

    // 1. scanf()输入。以换行和空格作为输入结束的标识。
    scanf("%s",str1); 

    /*
        输入: PAT PAT PAT
        输出:PAT
    */
    cout << "scanf()读入以空格和换行作为结束标识:" << str1 << endl; 
}
// 读入单个字符时 scanf需要加&符号
void test7(){
    char str;
    scanf("%c",&str); // 读入单个字符时,需要加&
    printf("输出:%c\n",str);
}
2. getchar()

getchar():输入单个字符,可以将输入中的换行和空格读入。

// getchar读入单个字符,可以读入空格和换行。
void test3(){
    // 2. getchar读入单个字符
    char c1,c2,c3;
    c1 = getchar();
    getchar();
    c2 = getchar();
    c3 = getchar();
    /*
    1.
        输入: abcd
        输出: c1 = a c2 = c c3 = d 
        b 被 第58行getchar()读入。
    2. getchar读入换行符。
        输入:ab 'enter' 
              c 'enter'
        输出:c1 = a c2 = 
              c3 = c
        因为getchar可以识别换行符,所以c2存储的是换行符: \n 在ac中有换行符出现。
    3. getchar读入空格
        输入:a b c
        输出:c1 = a c2 = b c3 = 
    */
    cout << "c1 = " << c1 << " c2 = " << c2 << " c3 = " << c3 << endl;
}
3. fgets()

 fgets可以读入嵌入空格的字符串到字符数组中。
fgets(char* str, int size, stdin): str是字符数组,size通常是一个非常大的数,stdin是标准输入流。

// fgets读入带有空格的一行输入,以换行作为结束输入的标志。
void test4(){
    /*
        输入:abcd  efg
        输出:fgets 可以读入带有空格的一行输入 abcd  efg
    */
    char str[20];
    fgets(str,1024,stdin);
    cout << "fgets 可以读入带有空格的一行输入 " << str << endl;
}
4. getline()

getline(cin,inputline):读取整行,包括前导和嵌入的空格,并将其存放到字符串对象中,inline是接收字符串的string变量名。

// getline(cin,lineinput):读入包含前导空格和嵌入空格的输入并存储到字符串对象lineinput中。
void test6(){
    /*

    输入:   abc  edf
    输出:getline读入带有前导和嵌入的到字符串对象str中:    abc  edf
    */
    string str;
    getline(cin,str);
    cout << "getline读入带有前导和嵌入的到字符串对象str中: " << str << endl;
}
5. cin

cin: 不能输入包含空格的字符串,以空格和换行作为结束输入的标志。

//cin 不能读入带有空格的字符串
void test5(){
    /*
        输入:ab  cd
        输出:cin 不能读入带有空格的字符串:ab
    */
    char str[20];
    cin >> str;
    cout << "cin 不能读入带有空格的字符串:" << str << endl;
}
6. gets()

gets(char* str):gets识别换行符作为输入结束的标志。[现在已经废弃,不建议使用]

2.2.2 字符数组的输出

相较于字符数组的输入,字符数组的输出较为简单,这里对其进行简单总结如下:

1. printf()

printf("%s",str):输出字符串
printf("%c",str):输出单个字符

2. putchar()

putchar(str):输出单个字符。

3. puts()

puts(str):输出一行字符串

4. cout

cout:常用输出流

3. sscanf和sprintf

sscanf(str, "%d", &n); 将字符数组str中的内容以"%d"的格式读入到n中。(自左向右)
sprintf(str, "%d", n); 将n以"%d"的格式存储到字符数组str中。(自右向左)

// sscanf(str,"%d",&n):将字符数组str中的内容以"%d"的格式输入到n中
void test8(){
    int n;
    char str[20] = "123";
    sscanf(str,"%d",&n);
    printf("%d\n",n);
}

// sprintf(str,"%d",n):将n以"%d"的格式输入到字符数组str中.
void test9(){
    int n = 233;
    char str[20];
    sprintf(str,"%d",n);
    printf("%s\n",str);
}

可以使用sscanf和sprintf进行复杂的格式输入输出。

void test10(){
    int n;
    double db;
    char str[100] = "2048:3.14,hello", str2[30];
    sscanf(str,"%d:%lf,%s",&n,&db,str2);
    printf("n = %d, db = %.2f, str2 = %s\n",
    n,db,str2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值