首页 > 其他分享 >c语言七 字符与其数组,函数

c语言七 字符与其数组,函数

时间:2022-10-13 14:45:26浏览次数:61  
标签:字符 函数 int str2 str1 char 数组 字符串

字符串与字符数组

字符数组定义
char array[1000];
字符数组初始化
char array[100]={'a','b','c','d'};
char array[100]="abcd";
char array[100]={0};  						//但凡为定义的,皆为\0
char array[]="abcd";

随机数产生rand和srand

1.头文件#include <stdlib.h>

2.rand是伪随机数产生器,每次调用rand产生的随机数都是一样的

3.如果调用rand之前先调用srand就出现任意的随机数

4.只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int t=(int)time(NULL);
    srand(t);
    for(int i =0;i<10;i++)
    {
        printf("%d\n",rand());  //诺,老师给的 rand()为随机数字
    }
        
}
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    srand((unsigned)time(NULL));			//自己的网上找的习惯用法 
    int i;									//想限制随机数字的范围,那就用余数%呗
    for(i=0;i<10;i++)
    {
        printf("%d\n",rand());
    }
}
用scanf输入字符串

不同于输入数字进行赋值,scanf给字符串时赋值时,不需要&这个符号

#include <stdio.h>
#include <stdlib.h>
int main(){
    char a[10]={10};
    scanf("%s",a);
/*    "%s"的作用就是输入一个字符串,scanf是以回车键和空格作为输入完成标
	  示的,且回车键本事不作为字符串的一部分
      如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就
      会缓冲区溢出,导致程序崩溃
      记住一个汉字俩个字节
*/
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d\n",a[i]);       //你试试输入abcd这些,看看出来的值
        							//是不是相对应与ascll码标的数
    }
    printf("__________________________________\n");
    printf("%s\n",a);
    system("pause");
    return 0;
}

字符串的结束标志

scanf将回车,空格都认为是字符串输入结束的标志.

不同的是按回车不但输入结束还会跳下面的代码. 而空格只会开摆,是输入了,但如果您要回车就一直呆在那

字符串处理函数(\0重点)

char a[3]="abc";
//你觉得对不对? 实际上,下面输出却是乱码 会输出显示:abc 烫烫..
printf("%s\n",a);
//原因 本身\0就占一个字节,虽然它本身不是有效的

使用字符串函数,加的头文件为: #include <string.h>!!!

gets函数

#include <stdio.h>
#include <stdlib.h>
int main(){
    char a[10]={0};
    gets(s);
    /* 	1.gets只认为回车是输入结束标示,空格不是.所以
   		 用gets这个函数就可以实现输入带空格的字符串
   		 
   		 2.gets和scanf一样存在缓冲区溢出的问题
   		 
   		 3.gets不能用'%s'或者'%d'之类的字符转义,只能接受字符串的输入
   	 */
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d\n",a[i]);
    }
    printf("-----------------\n");
    printf("%s",a);
    system("pause");
    return 0;
}

fgets函数

(文件设计)

#include <stdio.h>
#include <stdlib.h>
int main(){
    char a[10]={0};
	fgets(a,sizeof(a),stdin); 
/*	1.gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。
	 多出来的字符会导致内存溢出,fgets函数改进了这个问题。
	 
	2.由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便
   
    3.stdin是标准输入,一般指键盘输入到缓冲区里的东西.
    
    4.事实上只有9个字节?
*/
    printf("%s",a);				
    system("pause");
    return 0;
}

puts函数

#include <stdio.h>
#include <stdlib.h>
int main(){
    //puts函数打印字符串,与printf不同,puts会在最后自动添加一个'\n'
	char s[]="坚持勿弃";
	puts(s);
    printf("%s\n",s);
    system("pause");
    return 0;
}

fputs函数

(文件操作)

#include <stdio.h>
#include <stdlib.h>
int main(){
	char s[]="坚持勿弃";
	fputs(s,stdout);      		//fputs是puts的文件操作版本
    printf("\n%s\n",s);
    system("pause");
    return 0;
}

strlen函数,字符串长度

//size_t strlen(const char* _str);   返回不包含字符串结尾'0'的字符串长度
char s[100]="坚持就是胜利...";
int len=strlen(s); 		//得到字符串长度,返回一个字符串中有效
						//字符的数量(不包含字符串结尾的0)
printf("%d\n",len);     //最后输出一个数字 15
//自定义strlen函数实现
void _strlen(const char* _str)
{    
	int len=0; //计算_str长度
    if(_str!=NULL)
    {
        while((*_str++)!='\0')
            len++;
    }
    return len;
}

strcat函数,字符串追加

//size_t strcat(char* _str1,const char* _str2)将参数_str2追加到_str2后尾
char s[128]="前头";
int len=strlen(s);  //计算s字符串长度,返回一个字符串中的有效字符数量(不包含字符结尾的0)
printf("len=%d\n",len);
char s1[100]="abc123321";
strcat(s,s1);  	 //将俩个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题
printf("%s\n",s);//也就是编译器能看到加在一起,但还是会显示窗口出错
//自定义strcat函数实现
void _strcat(char *_str1,char* _str2)
{
    if(_str1!=NULL&&_str2!=NULL)
    {
        while(*_str1!='\0')
            _str1++;    //循环至str1字符串末尾
        while(*_str2!='\0')
            *_str1++=*_str2++;		//把字符串_str2里面的内容存储至_str1中
        *_str1='\0';				//结尾str1赋值'\0'表示字符串结束
    }
}

strncat函数,字符串有限追加

//size_t strncat(char* _str1,const char* _str2,size_t len)
	char s[128]="strncat()括号里面的3个东西你都需要理解";
	char s1[50]="123456789";
	
	strncat(s,s1,5);     //这里表示将s1的接在s身上,接5个字节,且过程忽略'\0'
	printf("%s\n",s);
//自定义strncat函数实现
void _strncat(char* _str1, const char*_str2, size_t len)
{
    if(_str1!=NULL&&_str2!=NULL)
    {
        while(*_str1!='\0')
            _str1++;
        int i;
        for(i=0;i<len;i++)
            *_str1++=*_str2++;
	}
}

strcmp函数,字符串比较

//int strcmp(const char*_str1,const char* str2)
//比较俩个字符串是否相等,相等返回0,不相等返回非零
//大于为-1  等于为0   小于为1
//比的是acsll码,比如下面的s为97,而s1位97+98  
	char s[128]="a";    
	char s1[50]="ab";	
	printf("%d\n",strcmp(s,s1);   
int _strcmp(const char* str1,const char* str2)
{
    int ret=0;
    if (str1 != NULL&&str2 != NULL){
		while (!(ret = *str1 - *str2) && *str1){
			str1++;
			str2++;
		}
	}

	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;

	return 0;							
}

strncmp函数,字符串有限比较

int strcmp(const char*_strl,const char*_str2,size_t len);

strcpy字符串拷贝

char *strcpy(char * _strl,const char*_str2);
//将参数_str2拷贝到参数_str1中,无论拷贝多少过去_str1都全变成_str2
//而且假如_str1[i]的i小于_str2[j]的j直接崩
//自定义strcpy函数实现
void _strcpy(char* _str1,const char* _str2)
{
    if(_str1!=NULL&&str2!=NULL)
    {
        while((*_str1++=*_str2++)!='\0')
    }
}

strncpy函数字符串有限拷贝

假如_str1[i]的i小于_str2[j]的j,且拷贝过去
后,_str1[i]还有'\0'那么那些'\0'直接"烫"给你看

sprintf函数,格式化字符串

和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串.

sscanf函数

sscanf类似于scanf函数,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入

char s[128]="10  0xf5  aabc";
int x,y;
char b[100];
sscanf(s,"%d %X %[a-z]",&x,&y,b);   //记住这些格式吧
printf("%d\n",x);
printf("%x\n",y);
printf("%s\n",b);

strchr函数查找字符

char * strchr(char * _str,int _ch);
//在参数_str中查找_ch指定字符,找到返回字符_ch在_str中所在位置,没有找到则返回NULL
//自定义strchr函数实现
char * strchr(char * _str,int _ch)
{
    if(str1 != NULL)
    {
        while(*_str1++!='0')
            if(*_str1==ch)
            {
                return (char*)_str1;
            }
 	}
    return NULL;
}

strstr函数

char s[10]="asdfa";
char s1[10]="df";
printf("%s",strstr(s,s1));
//用整个s1[10]的df在s[10]里面找 显示df及后面的字符串,  找不到就输出显示: (NULL)
//输出显示  dfa
char* _strstr(char* _str,const char* _substr)
//在参数_str中查找参数_substr指定子串,找到返回子串在_str中所在位置,没有找到就返回NULL
//自定义strstr函数实现
char * _strstr(char* _str,const char*_substr)
{
    if(_str!=NULL&&substr!=NULL)
    {
     	int lenstr=strlen(_str);
        int lensub=strlen(_substr);
        if(lenstr<lensub)
            return NULL;
        int i,j;
        for(i=0;i<lenstr;i++)
        {
            for(j=0;j<lensub;j++)
            {
                if(_str[i+j]!=_substr[j])
                    break;
            }
            if(j==lensub)
                return &_str[i];
        }
    }
    return NULL;
}

strtok函数分割字符串

char s[10]="asdfghad";
char s1[10]="gh";
printf("%s\n",strtok(s,s1));
//输出显示: asdf  
//用s1[10]的第一个字符,第一个字符!!!g到s[10]里面寻找
//若找不到,则完整输出显示: asdfghad
//若找到,则输出它前面的所有字符串,不包括自己
//字符在第一次调用是strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULLL每次调用成功则返回指向被分割出片段的指针

char buf[]="abc@defg@igk";
char* p=strtok(buf,"@");
while(p)
{
    printf("%s\n",p);
    p=strtok(NULL,"@");
}

atoi转化为int

atof转化为float

atol转化为long

需要包含头文件stdlib.h

标签:字符,函数,int,str2,str1,char,数组,字符串
From: https://www.cnblogs.com/CzzA/p/16788099.html

相关文章