【算法】C\C++ 输出输出

由于OJ系统检测内存和算法时间对Java很不利,因此转行学习C++。

使用C语言的输入输出最节省时间

C

总结

gets 输入一行字符串
getchar 输入一个字符 包括空格、制表符和换行符

getline是C++的

scanf

【参考:C语言scanf:读取从键盘输入的数据(含输入格式汇总表)

1.scanf()函数
原型:int scanf(const char *restrict format,…);
入口参数:第一个参数是格式字符串,它指定了输入的格式,…格式化后的字符串存取地址。
返回值:函数返回值为int类型,如果读取到了“文件结束”则返回EOF,EOF为Ctrl+z或者Ctrl+d。其他情况则返回int型数字,例如:int res = scanf("%d %d",&a,&b);如果a,b都读取成功,则返回2;如果a,b只读取成功了一个,则返回1;如果a,b都没有读取成功,则返回0.

区别

【参考:C语言 gets()和scanf()函数的区别 - wanghetao - 博客园

gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。

char string[15]; gets(string); /*遇到回车认为输入结束*/

scanf("%s",string); /*遇到空格认为输入结束*/

所以在输入的字符串中包含空格时,应该使用gets输入

scanf和gets获取字符串时的区别

在C语言中,能构获取字符串的函数至少有两个:

1.scanf()

所在头文件:stdio.h

语法:scanf(“格式控制字符串”,变量地址列表);

接受字符串时:scanf("%s",字符数组名或指针);

2.gets()

所在头文件:stdio.h

语法:gets(字符数组名或指针);

两者在接受字符串时:

1.不同点:

scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;

2.相同点:

字符串接受结束后自动加’\0’。

重点

【参考:C语言中scanf/getchar()和gets()输入问题集锦_何玉先先的博客-CSDN博客

#include <stdio.h>

int main()

{

    char ch1[10], ch2[10];

    scanf("%s", ch1);
    gets(ch2);
    printf("%s\n", ch1);
    printf("%s\n", ch2);
    return 0;

}
情况一
输入:
asd空格123sd回车键

输出:
asd
空格123sd

情况二
输入:
asd回车

输出:
asd
回车
  • 情况二
    因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(/n)而结束的,这个/n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符串后会留下字符/n,这样第二次的读入函数直接从缓冲区中把/n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!

【参考:C语言 getchar原理及易错点解析_Kevin.wang-CSDN博客

#include <stdio.h>

int main()

{

    char ch1[10], ch2[10];

    scanf("%s", ch1);
    getchar();// 吸收一个回车或空格
    gets(ch2);
    printf("%s\n", ch1);
    printf("%s\n", ch2);
    return 0;

}
情况一
输入:
asd空格123空格sd回车键

输出:
asd
123空格sd

情况二
输入:
asd回车键
123空格fg回车键

输出:
asd
123空格fg

第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!

读取字符时:

scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;

读取字符串时:

scanf()以Space、Enter、Tab结束一次输入,舍弃最后的回车符。
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!

字符串

【参考:c与c++定义字符串的异同_给你更好的-CSDN博客

C语言中用字符型char来表示存储字符,没有C++里面的可以单独的字符串类型String;

所以C里面使用字符数组和字符指针来实现字符串功能;

C的字符数组只能在定义时一起赋值以后只能给单个元素一一赋值

char string0[10];

char string1[]=“prison break”;

char string2[100]=“michael scofield”;

1句表示定义个长度为10的字符串,但未赋值,2句表示定义了一个字符数组string1,并进行初始化,使得其长度自动为13(字符串”prison break"中的字符个数加上结尾的’\0’),3句定义了一个有100个元素的字符数组string2,并初始化了17个元素(“michael scofield”;加上结尾的’\0’)。

C语言本身是没有设置一种类型来定义字符串变量的,字符串的存储完全依赖于字符数组,但字符数组又不等于是字符串变量。在字符型一维数组存放字符串,并规定以字符’\0’作为字符串结束标志。

ASCII码值 0 表示空字符,空字符就是平时所说的字符 ‘\0’
字符 ‘0’,ASCII码值为 48,如:“012” 字符串中的 0 表示字符 ‘0’。
数字 0, 所说的数字 0,就是平时说的十进制数字 0,其ASCII码为 0,在字符串中表示 ‘\0’,即空字符。


【参考:C语言遍历字符串的两种方式(代码)_Aiden_yan的博客-CSDN博客
【参考:【C语言】关于遍历字符串的三种方法_请赐予我力量-CSDN博客

  • strlen 字符串的长度不包括’\0’

一.使用指针

#include <stdio.h>
#include <string.h>
int main()
{
    char* s = "You are beautiful!";
    for (int i = 0;i < strlen(s);i++)
    {
        printf("%c", s[i]);
    }
    return 0;
}
// You are beautiful!

#include <stdio.h>
#include <string.h>
 
#define MAX_SIZE 1024
 
int main()
{
    char src[MAX_SIZE] = {0};
    char *temp = src;
 
    printf("Please input string : ");
    gets(src);
 
    printf("string = ");
 
    while (*temp != '\0')
    {
        printf("%c", *temp);
        temp++;
    }
    printf("\n");
 
    return 0;
}

二.字符数组的方式

#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
int main()
{
    char src[MAX_SIZE] = {0};
    printf("请输入一个字符串 : ");
    gets(src);
    printf("您输入的字符串为 : ");
 
    // char src[] = "You are beautiful!";
    // char src[] = { "You are beautiful!" };
    
    for (int i = 0; i < strlen(src); i++)
    {
        printf("%c", src[i]);
    }
    return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <string.h>
 
#define MAX_SIZE 1024
 
int main()
{
    char src[MAX_SIZE] = {0};
    int i = 0;
 
    printf("Please input string : ");
    gets(src);
 	
    printf("string = ");
 	// char src[] = "You are beautiful!";
    while (src[i] != '\0')
    {
        printf("%c", src[i]);
        i++;
    }
    printf("\n");
 
    return 0;
}

【参考:C++ 字符串与字符数组 详解_ZeroZone零域的博客-CSDN博客

C语言字符串的输入和输出
【参考:C语言字符串的输入和输出

C++

刷题

#include<bits/stdc++.h>//万能头文件

ios::sync_with_stdio(false);
	//cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,
	//导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,
	//可以节省许多时间,使效率与scanf与printf相差无几

String类怎么用scanf读取

【参考:c++中String类怎么用scanf读取_huqiaolong的博客-CSDN博客

在用scanf读取时,必须声明长度。不声明长度,直接scanf会出现运行时错误。

#include <stdio.h>
#include <string>
using namespace std;
int main()
{
	string a;
	a.resize(100); //需要预先分配空间
	scanf("%s", &a[0]);
	puts(a.c_str());
	return 0;
}

输入

【参考:C++中各种输入函数的用法总结 - 强威 - 博客园

cin

cin函数遇到空格、TAB、换行时读取结束

输入字符串

#include <iostream>
  using namespace std;
  void main ()
  {
    char a[10];
    cin>>a;
    cout<<a<<endl;
  }
输入:aaabbbccc
输出:aaabbbccc

输入:aaa bbb ccc
输出:aaa
#include<iostream>
#include<string>

using namespace std;
int main()
{
    string s;
    cin >> s;
    cout << s;
    return 0;

}
123 456 jkl
123

cin.get()

刷题

【参考:C语言scanf和printf在刷题中的注意点 (用scanf和printf替换cin和cout,加快速度) - 拾月凄辰 - 博客园

scanf、printf比cin、cout速度要快,而且很多时候使用cin会超时,但scanf不会超时,建议以后都用scanf处理输入,printf处理输出。

记住以下4点建议:

  1. scanf读入double类型只能用%lf,读入float类型只能用%f

  2. printf对于double和float都只能用%f,因为printf没有%lf (可能有些系统允许,但是最好坚持使用%f)

  3. printf输出string类型要用%s,而且必须使用c_str()将string转为const char*再输出

printf("%s\n", a.c_str());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++PCM混流输出算法可以通过以下步骤实现: 1. 定义PCM数据结构,包括采样率、位深、声道数等信息。 2. 定义混流器数据结构,包括PCM数据结构、输出缓冲区等信息。 3. 初始化混流器,包括创建输出缓冲区、设置PCM参数等。 4. 循环读取PCM数据,将每个PCM数据块按照规则混合到输出缓冲区中。 5. 输出混合后的PCM数据。 下面是一个简单的C++ PCM混流输出算法示例代码: ```c++ #include <iostream> #include <vector> #include <cstring> using namespace std; // PCM数据结构 struct PcmData { int sampleRate; // 采样率 int bitDepth; // 位深 int channelCount; // 声道数 vector<char> data; // PCM数据 }; // 混流器数据结构 struct Mixer { PcmData pcm; vector<char> outputBuffer; }; // 初始化混流器 void InitMixer(Mixer& mixer, int sampleRate, int bitDepth, int channelCount) { mixer.pcm.sampleRate = sampleRate; mixer.pcm.bitDepth = bitDepth; mixer.pcm.channelCount = channelCount; mixer.outputBuffer.resize(1024); // 输出缓冲区大小为1024字节 mixer.pcm.data.clear(); // 清空PCM数据 } // 混流PCM数据 void MixPcmData(Mixer& mixer, const PcmData& pcmData) { // 检查PCM参数是否一致 if (mixer.pcm.sampleRate != pcmData.sampleRate || mixer.pcm.bitDepth != pcmData.bitDepth || mixer.pcm.channelCount != pcmData.channelCount) { return; } // 计算每个采样点的字节数 int sampleSize = mixer.pcm.bitDepth / 8 * mixer.pcm.channelCount; // 循环混合每个采样点 for (size_t i = 0; i < pcmData.data.size(); i += sampleSize) { // 将当前采样点混合到输出缓冲区 for (int j = 0; j < sampleSize; j++) { mixer.outputBuffer[i + j] += pcmData.data[i + j]; } } } // 输出混合后的PCM数据 void OutputMixedPcmData(const Mixer& mixer) { cout << "Mixed PCM Data:" << endl; for (size_t i = 0; i < mixer.outputBuffer.size(); i++) { cout << mixer.outputBuffer[i]; } } int main() { // 初始化2个PCM数据,采样率、位深、声道数均相同 PcmData pcmData1 = {44100, 16, 2, {'1', '2', '3', '4', '5', '6', '7', '8'}}; PcmData pcmData2 = {44100, 16, 2, {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}}; // 初始化混流器 Mixer mixer; InitMixer(mixer, pcmData1.sampleRate, pcmData1.bitDepth, pcmData1.channelCount); // 混流2个PCM数据 MixPcmData(mixer, pcmData1); MixPcmData(mixer, pcmData2); // 输出混合后的PCM数据 OutputMixedPcmData(mixer); return 0; } ``` 上述代码实现了2个PCM数据的混合输出,可以根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值