字符串随笔

miao-jc / 2024-03-06 / 原文

读字符串函数fgets

功能:从文件中读取字符串,每次只读取一行。
注意:

  1. fgets每次最多只能读取n-1个字2.符,第n个为NULL。
  2. 当遇到换行符或者EOF时,即使当前位置在n-1之前也读出结束。
  3. 若函数返回成功,则返回 字符串数组str的首地址。

例:小L很喜欢听私人笑声,可是有些歌曲他没有夹带私人笑声,小L就很生气,请你帮帮小L给歌曲带上私人笑声吧。

给你一段歌词,请你在所有’.'后面加上"xixixixi.",然后再输出全部歌词,例如给你一段歌词为:

“da ji da li,jin wan chi ji.xiong di jie mei,come on wo men yi qi.lao si ji,lao si ji ta zai zhe li.”

输出答案则是:

“da ji da li,jin wan chi ji.xixixixi.xiong di jie mei,come on wo men yi qi.xixixixi.lao si ji,lao si ji ta zai zhe li.xixixixi.”

输入描述

给你一行字符串,字符只由小写字母和",“和”."还有空格构成。(字符串长度<=1e6)

输出描述

输出题目要求字符串

用例输入 1

da ji da li,jin wan chi ji.xiong di jie mei,come on wo men yi qi.lao si ji,lao si ji ta zai zhe li.

用例输出 1

da ji da li,jin wan chi ji.xixixixi.xiong di jie mei,come on wo men yi qi.xixixixi.lao si ji,lao si ji ta zai zhe li.xixixixi.

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	char ss[100];
	fgets(ss,100,stdin);
	int n=strlen(ss);
	
	for(int i=0;i<n;i++)
	{
		if(ss[i]=='.')
		{
			cout<<".xixixixi";
		}else
		{
			cout<<ss[i];
		}
	}
	return 0;
}

洛谷:P1957 口算练习题

to_string 可以将整形数据转化为字符串,stoi()函数可以将字符串转化为整形数据。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	string s;
	char c;
	int d,e;
	while(n--)
	{
		cin>>s;
		if(s[0]=='a'||s[0]=='b'||s[0]=='c')
		{
			c=s[0];
			cin>>d>>e;
		}else
		{
			d=stoi(s);
			cin>>e;
		}
		if(c=='a')
		{
			cout<<d<<"+"<<e<<"="<<d+e<<endl;
			string ss="";
			ss+=to_string(d)+'+'+to_string(e)+'='+to_string(d+e);
			cout<<ss.size()<<endl;
		}if(c=='b')
		{
			cout<<d<<"-"<<e<<"="<<d-e<<endl;
			string ss="";
			ss+=to_string(d)+'-'+to_string(e)+'='+to_string(d-e);
			cout<<ss.size()<<endl;
		}if(c=='c')
		{
			cout<<d<<"*"<<e<<"="<<d*e<<endl;
			string ss="";
			ss+=to_string(d)+'*'+to_string(e)+'='+to_string(d*e);
			cout<<ss.size()<<endl;
		}
	}
	return 0;
}

getline()用的比较多的用法

(1) istream& getline (istream& is, string& str, char delim);

(2) istream& getline (istream& is, string& str);
如果在使用getline()之前有使用scanf()那么需要用getchar()将前面的换行符读取,再使用getline(),

在使用scanf()函数读取数据时,scanf()函数会读取输入的内容,但是会在输入缓冲区中留下一个换行符(由于用户按下回车键而产生),而getline()函数在读取输入时会将换行符视为新的一行,因此可能会出现意外的问题。
为了解决这个问题,可以在使用getline()函数之前使用getchar()函数将换行符读取掉,从而确保getline()函数可以正确读取输入。
例:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	string s;
	cin>>s;
	getchar();
	string ss;
	getline(cin,ss);
	int k1=0,k2;
	if(ss.find(s)!=string::npos)
	{
		k2=ss.find(s);
		while(ss.size()>0)
		{
			k1++;
			ss.erase(ss.find(s),s.size());
			if(ss.find(s)==string::npos)
			{
				break;
			}
		}
		cout<<k1<<" "<<k2<<endl;
	}
	else
	{
		cout<<"-1"<<endl;
	}
	return 0;
}

分析代码问题
这段代码的目的是从输入的两个字符串中删除第一个字符串中出现的所有子串,并输出删除操作的次数和第一个删除操作的位置。

但是,该代码存在一些问题:

在使用getline(cin, ss)函数时,会忽略掉输入缓冲区中的换行符,导致第二个字符串读取失败。应该在读取第一个字符串后使用cin.ignore()来清除输入缓冲区中的换行符。

is是一个流,例如cin

str是一个string类型的引用,读入的字符串将直接保存在str里面

delim是结束标志,默认为换行符

getline()这个函数是可以读取空格,遇到换行符或者EOF结束,getline是读取换行符的,只是读取后丢弃了,所以缓冲区内就没有换行符了,这与fgets()存在着差异

getline()函数也可以指定一个可选的分隔符参数,用于指定读取行的结束标志,例如getline(cin, line, ',')表示遇到逗号','时停止读取。

在日常使用中我们经常需要将getline与while结合使用
例1:

string str;
    while(getline(cin,str)){
        。。。
    }

那么在这个例子中是不是我们输入了一个回车就会跳出循环呢,答案是否定的,while只会检测cin的输入是否合法,那么什么时候会跳出循环呢,只有1.输入EOF,2.输入到了文件末尾
例2:

string str;
while(getline(cin,str),str != "#"){
  。。。
}

在这个例子中,逗号运算符的作用就是将最后一个式子作为判定的条件,即while判断的是str != "#"这个条件,只有当输入到str的为#键时,循环才会结束
https://blog.csdn.net/m0_37616927/article/details/86749099

在原字符串中给查找指定字符串 .find()

to_string

集美大学“第十五届蓝桥杯大赛”
https://zhuanlan.zhihu.com/p/678902967
【3】20231122
求区间[2023,20231122]范围内的整数出现 1122 子串的整数数量。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ans=0;
	for(int i=2023;i<=20231122;i++)
	{
		ans+=to_string(i).find("1122")!=string::npos;
	}
	cout<<ans<<endl;
	return 0;
}

to_string(i) 是一个 C++ 标准库函数,用于将整数转换为对应的字符串。接受一个整数作为参数,并返回一个表示该整数的字符串。

例如:如果你有一个整数变量 int num = 123,你可以使用 to_string(num) 来将它转换为字符串。函数将返回一个包含 "123" 的字符串。(✳只适用于整形数据)

当你想要在一个字符串中找到一个特定的子字符串时,可以使用 .find("1122") 函数。它接受一个字符串作为参数,并返回一个表示该子字符串在原始字符串中第一次出现的位置的整数值。(✳.find()函数只会返回第一次出现的位置(从0开始索引)。)

例如,如果你有一个字符串变量 string str = "112233445566";,你可以使用 str.find("1122") 来找到子字符串 "1122" 在原始字符串中的位置。如果 "1122" 存在于字符串中,函数将返回一个非负整数,表示子字符串的起始位置。如果子字符串不存在,函数将返回一个特殊的值 string::npos。

字符串如何删去制定范围内的字符

要删除字符串中指定范围内的字符,可以使用erase函数来实现。erase函数的第一个参数是要删除字符的起始位置,第二个参数是要删除字符的个数。

例如,如果要删除字符串中从索引位置2开始的3个字符,可以这样做:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    str.erase(2, 3);
    
    std::cout << str << std::endl; // 输出: Hel, World!
    
    return 0;
}

在上面的例子中,调用str.erase(2, 3)会删除字符串str中从索引位置2开始的3个字符,即"llo"这三个字符被删除了。