如何入手ACM(新手高阶篇)

前言

基本上所有基础的内容都交给你了,就剩下一个字符串没讲了。

在c语言中是没有字符串这个东西的,我们只能用字符数组来存储一个字符串。
但是在c++中我们可以直接定义一个字符串类型的变量,这两个是不同的。本章主要讲字符数组。

字符的输入与输出

c语言写法

#include <cstido>
#include <cstring>
char x;
char a[100];
int main()
{
	int i;
	//字符变量,需要加取址符&
	scanf("%c",&x);
	printf("%c",x);
	//字符串不需要加取址符
	scanf("%s",a);
	printf("%s",a);
	return 0;
}

c++写法:

#include <iostream>//头文件不一样
#include <cstring>
using namespace std;
char a[100];
char x;
int main()
{

	cin>>x;
	cout<<x;
	
	cin>>a;
	cout<<a;	
	return 0;
}

c++的输入输出简单粗暴,连变量类型也不要输入。但是暂时不推荐用

注意:字符数组中字符串的输入都是从第零位开始的。
顺便说下:一个字符占一个字节,一个INT占四个字节,其他的可以自己查查。

例题

现在我们通过题目来了解一下字符数组的遍历。注意这里面有很多知识点的
题目链接:https://www.luogu.com.cn/problem/P1055

题目很简单,将所有的数字加起来(除最后一个数字)对11取模后与最后一位进行对比。符合条件就是right,否则输出正确的号码

#include <cstdio>
#include <cstring>
char str[100];
int ans = 0;
int sit = 1;
int main()
{
	int i;
	scanf("%s",str);
	//strlen(str)会返回字符串str的长度
	//这里为什么要减2呢?因为最后两个字符是不需要参与运算的,少循环一次是一次
	for(i=0;i<strlen(str)-2;i++)
	{
	//论数字字符如何转化成整型数字
		if(str[i] - '0' >=0 && str[i] - '0' <= 9)//是数字的话
		{
			ans += (str[i] - '0') * sit;
			sit++;
		}
	}
	if(ans % 11 == str[strlen(str)-1] - '0' )printf("Right");
	else if(ans % 11 ==10 && str[strlen(str)-1] == 'X')printf("Right");
	else 
	{
		for(i=0;i<strlen(str)-1;i++)printf("%c",str[i]);
		if(ans % 11 != 10)printf("%d",ans%11);
		else printf("X");//各种细节
	}
	return 0;
}

再次再总结一下几个常用的函数(好像需要cstring库)

strcmp(str1,str2)/strncmp(str1,str2,n)

这个函数是用来比较两个字符串是否相等的,如果相等那么其值为0
如果str1<str2会返回负数;str1>str2,则返回正数。

字符串大小的比较是根据字典序来的。“a”<“b” “aa”<“ab”<“bb”
这个strncmp是将str1和str2的前n个字符进行比较。

strcpy(str1,str2)/strncpy(str1,str2,n)

这个是用来复制函数的,它会将str2的值赋给str1中。strncpy讲str2前n个字符复制给str1。

strcat(str1,str2)/strncat(str1,str2,n)

将你可以理解为str1 = str1+str2 但是不能这样写。

memset(str,0,sizeof(str))

这个是将数组初始化,什么类型的数组都可以,在函数中声明的局部变量的初始值并不为零。需要初始化。

目前就这么多。

发布了36 篇原创文章 · 获赞 29 · 访问量 3942

猜你喜欢

转载自blog.csdn.net/YUK_103/article/details/103299469