当前位置:网站首页>[C language] string function

[C language] string function

2022-07-07 18:24:00 Ordinary person 1

author :@ Ordinary person 1

special column :《C Language from 0 To 1》

In a word : In the past , All is prologue

explain : The past is irreparable , The future can change


We learned from 4 A function ——strlen\strcpy\strcat\strcmp, The length of these functions is unlimited , today , We naturally want to introduce some other functions . The content may be relatively large .

String function with limited length

strncpy

image-20220707091932481

char * strncpy ( char * destination, const char * source, size_t num );
  1. Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
  2. Copy num Characters from the source string to the target space .
  3. If the length of the source string is less than num, After copying the source string , Add... After the target 0, until num individual .

below , Let's test it briefly :

#include <stdio.h>
#include <string.h>
int main()
{
    
	char arr1[20] = "abcdef";
	char arr2[] = "hello world";
	strncpy(arr1, arr2, 5);
	printf("%s\n", arr1);
	return 0;
}

function :image-20220707093803269

Let's take a look at the The first 3 spot

#include <stdio.h>
#include <string.h>
int main()
{
    
	char arr1[20] = "abcdef";
	char arr2[] = "ghi";
	strncpy(arr1, arr2, 5);//arr2 Only 3 Here you have to copy 5 individual , What's the matter 
	printf("%s\n", arr1);
	return 0;
}

F10 Debug and check before copying arr1 and arr2 It looks like this :image-20220707094657476

After copying ?image-20220707094744118

We can see clearly that , It will be used when the content is not enough ’\0’ To add !

strncat

image-20220707095134661

char * strncat ( char * destination, const char * source, size_t num );
  1. Appends the first num characters of source to destination, plus a terminating null-character.
  2. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.
#include <stdio.h>
#include <string.h>
int main()
{
    
	char arr1[20] = "hello\0xxxxx";
	printf("%s\n", arr1);
	char arr2[] = "world";
	strncat(arr1, arr2, 3);
	printf("%s\n", arr1);
	return 0;
}

As a result, we all know , What is the process like ? We might as well debug and have a look : Before appending :

After addition :image-20220707095641466

We can see clearly that , It will automatically add a ’\0’

What if the additional length is larger than itself ? Will it be like strncpy You can make up as many as you like ’\0’ Well ? Test a piece of code :

#include <stdio.h>
#include <string.h>
int main()
{
    
	char arr1[20] = "hello\0xxxxx";
	printf("%s\n", arr1);
	char arr2[] = "abc";
	strncat(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

Before addition :image-20220707100015102

After addition :image-20220707100040572

The answer is No , Only one will be added ’\0’. By simple analysis , We probably know strncat Principle .

strncmp

image-20220707100258557

int strncmp ( const char * str1, const char * str2, size_t num );

Compare to a different character or the end of a string or num Compare all the characters .

#include <stdio.h>
#include <string.h>
int main()
{
    
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);
	if (ret == 0)
	{
    
		printf("==\n");
	}
	else if (ret < 0)
	{
    
		printf("<\n");
	}
	else
	{
    
		printf(">\n");
	}
	return 0;
}

image-20220707101140742

actually , There are more functions n There will be more length restrictions , It doesn't make much difference , The string function with limited length makes the code more rigorous , We try to use .

String search

strstr

image-20220707101413372

char * strstr ( const char *str1, const char * str2);

Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

Simple understanding , This function is the function to find the substring

#include <stdio.h>
#include <string.h>
int main()
{
    
	char email[] = "[email protected]";
	char substr[] = "eichang";
	char*ret = strstr(email, substr);
	if (ret == NULL)
	{
    
		printf(" Substring does not exist \n");
	}
	else
	{
    
		printf("%s\n", ret);
	}
	return 0;
}

image-20220707101942440

How to use it is not the point , The key point is how to simulate the implementation !

strstr Simulation Implementation of

Let's talk about the search process first :

Can be divided into Two kinds of To illustrate the situation :

A kind of It's a simple case : One match will find

Another kind It's a complicated situation : The first match was not found , You need to record the current location , Keep matching , It takes many times to find

image-20220707103859541

The following is a simple simulation :

#include <assert.h>
#include <stdio.h>
char*my_strstr(const char*str1,const char*str2)
{
    
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	while (*p)
	{
    
		s1 = p;
		s2 = str2;
		while (*s1!='\0'&&*s2!='\0'&&* s1 == *s2)
		{
    
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
    
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

int main()
{
    
	char email[] = "[email protected]";
	char substr[] = "eichang";
	//char*ret = strstr(email, substr);
	char* ret = my_strstr(email, substr);
	if (ret == NULL)
	{
    
		printf(" Substring does not exist \n");
	}
	else
	{
    
		printf("%s\n", ret);
	}
	return 0;
}

You can use the substring here KMP Algorithm , But it's more complicated , We won't expand the description .

strtok

image-20220707105048477

char * strtok ( char * str, const char * sep );

sep The parameter is a string , Defines the set of characters used as separators

The first parameter specifies a string , It contains 0 One or more by sep A character separated by one or more separators in a string remember .

strtok Function found str The next mark in , And use it \0 ending , Returns a pointer to the tag .( notes : strtok Function changes the string being manipulated , So it's using strtok The string segmented by function is usually the content of temporary copy And it can be modified .)

strtok The first argument of the function is not NULL , Function will find str The first mark in ,strtok The function will save it in the string Position in .

strtok The first argument to the function is NULL , The function will start at the same position in the string that is saved , Find the next target remember .

If there are no more tags in the string , Then return to NULL The pointer .

I think this is a strange function , However, it does not prevent us from recognizing that it cuts strings

#include <stdio.h>
#include <string.h>
int main()
{
    
	const char* sep = "@.";
	char email[] = "[email protected]";
	char cp[30] = {
     0 };
	strcpy(cp, email);

	char*ret = strtok(cp, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	return 0;
}

image-20220707105512359

How and for Loop linked

#include <stdio.h>
#include <string.h>
int main()
{
    
	const char* sep = "@.";
	char email[] = "[email protected]";
	char cp[30] = {
     0 };
	strcpy(cp, email);

	char* ret = NULL;
	for (ret = strtok(cp, sep); ret != NULL; ret = strtok(NULL, sep))
	{
    
		printf("%s\n", ret);
	}
	return 0;
}

Error message report

strerror

image-20220707105848512

char * strerror ( int errnum );

Return error code , The corresponding error message .

#include <stdio.h>
#include <string.h>
int main()
{
    
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));
}

image-20220707110144327

These do not need us to remember ,error-C A global error code storage variable of language settings

for instance :

#include <stdio.h>
#include <string.h>
int main()
{
    
    FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	else
	{
    

	}

    return 0;
}

image-20220707110347132

Character classification function

There are many functions , Scattered , Does not Give examples one by one to illustrate , ad locum , You can know and practice by yourself :

function If his parameters meet the following conditions, it returns true

iscntrl Any control character

isspace Blank character : Space ‘ ’, Change the page ‘\f’, Line break ’\n’, enter ‘\r’, tabs ’\t’ Or vertical tabs ’\v’

isdigit Decimal number 0~9 isxdigit Hexadecimal number , Include all decimal digits , Lowercase letters af, Capital AF

islower Lowercase letters a~z

isupper Capital A~Z

isalpha Letter az or AZ

isalnum Letters or numbers ,az,AZ,0~9

ispunct Punctuation , Any graphic character that is not a number or letter ( Printable )

isgraph Any graphic character

isprint Any typeable character , Including graphic characters and white space characters

#include <stdio.h>
#include <ctype.h>
int main()
{
    
    int i = 0;
    char str[] = "Test String.\n";
    char c;
    while (str[i])
    {
    
        c = str[i];
        if (isupper(c))
            c = tolower(c);
        putchar(c);
        i++;
    }
    return 0;
}

image-20220707111234962


原网站

版权声明
本文为[Ordinary person 1]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071614196355.html