指针和字符串
当字符串(字符数组)做函数参数时,不需要提供两个参数,因为每个字符串都有\0的结束标记
字符串比较stecmp
两个字符串挨个相比,如果都相等 ,就返回0,不同返回1(第一个字符串大)或-1(第二个字符串大),这与元素个数无关,比出大小了之后就不往后面比了后面直接丢掉
比的是ASCII码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int strcmp_self(char *str1, char *str2);
int main(void)
{
char *str1 = "hellor";
char *str2 = "helloz";
int a = strcmp_self(str1, str2);
if (a == 0)
{
printf("相同\n");
}
else if(a == 1)
{
printf("str1 > str2\n");
}
else if(a == -1)
{
printf("str1 < str2\n");
}
else
{
printf("异常\n");
}
system("pause");
return EXIT_SUCCESS;
}
//str1和str2比较,如果相等返回0,str1>str2返回1,否则返回-1
int strcmp_self(char *str1, char *str2) { //光写str1的话是两个字符,字符串要加*
int i = 0;
while (*str1 == *str2);
{
if (*str1 == '\0')
{
return 0; //字符串一样
}
str1++;
str2++;
}
return *str1 > *str2 ? 1 : -1;
}
字符串拷贝
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void strcpy_self(char *src, char *dst);
int main(void)
{
char *src = "hello";
char dst[100] = {0};
strcpy_self(src, dst);
printf("%s\n", dst);
system("pause");
return EXIT_SUCCESS;
}
//src:源,dst:目标
void strcpy_self(char *src, char *dst) {
int i = 0;
for (; src[i] != '\0'; i++)
{
dst[i] = src[i];
}
dst[i] = '\0';
}
字符串去空格
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void str_nospace(char *src, char *dst);
void str_nospace_zhizhenban(char *src, char *dst);
int main(void)
{
char src[] = "ni chou sha chou ni za di ";
char dst[100] = {0};
str_nospace_zhizhenban(src, dst);
printf("%s\n", dst);
system("pause");
return EXIT_SUCCESS;
}
//src:有空格的字符串 dst:没空格的字符串
void str_nospace(char *src, char *dst) {
int i = 0, j = 0; //i遍历字符串src,j记录dst存储位置
while (src[i] != '\0')
{
if (src[i] != ' ') {
dst[j] = src[i];
j++;
}
i++;
}
dst[j] = '\0';
}
//指针版
void str_nospace_zhizhenban(char *src, char *dst) {
while (*src != '\0')
{
if (*src != ' ')
{
*dst = *src;
dst++;
}
src++;
}
*dst = '\0';
}
带参数的main函数
指针数组的本质是二级指针
int main(int argc, char *argv[]) == int main(int argc, char **argv)
参数1:表示给main函数传递的参数的总个数
参数2:是一个数组,数组的每一个元素都是char*,即字符串,数组名为argv
这样的话就可以不用写scanf了,默认会等输入的内容,默认不能带空格
测试1:在命令行中,使用gcc编译生成可执行文件,文件名.exe aa b v c d sf g ew er这样对应的结果就是argv[0] = 文件名.exe argv[1] = aa …依次排下去,argc就是10
测试2:在vs中,右键项目名称-> 属性-》调试-》命令行参数,在这里面写要输入的东西
str中找substr第一次出现的位置
char *strstr(char *str,char *substr);
功能:在 str中找substr的位置,从第一次出现的位置开始,把他后面的东西都输出出来
eg:源串:ehlfdfiefdafi,子串:fdf,那么返回值是fdfiefdafi
找不到的话会返回null
统计子串出现的次数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int str_count(char *str, char *substr);
//统计字符串中子串出现的次数
int main(void)
{
char str[] = "helulol9lolulo";
char substr[] = "llo";
int ret = str_count(str, substr);
printf("出现%d次\n", ret);
system("pause");
return EXIT_SUCCESS;
}
int str_count(char *str, char *substr) {
int count = 0;
char *p = strstr(str, substr);
while (p != NULL)
{
count++;
p += strlen(substr); //p = p+strlen(substr)
p = strstr(p, substr); //返回"llo"
}
return count;
}
求非空字符串的元素个数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int no_space_str(char *str) ;
int main(void)
{
char str[] = "ni chou sha chou ni za di";
int ret = no_space_str(str);
printf("%d\n", ret);
system("pause");
return EXIT_SUCCESS;
}
int no_space_str(char *str) {
int count = 0;
char *p = str; //常量不能变的话就把他传给变量,让变量变
while (*p != '\0')
{
if (*p != ' ')
{
count++;
}
p++;
}
return count;
}
字符串逆制str_inverse、 判断字符串回文str_reverse
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void str_reverse(char *str);
int str_back(char *str) ;
int main(void)
{
char str[] = "this is a test";
char str2[] = "abcdscba";
int a = str_back(str2);
if (a == 0)
{
printf("不是回文\n");
}
else
{
printf("是回文\n");
}
str_reverse(str);
printf("%s\n", str);
system("pause");
return EXIT_SUCCESS;
}
void str_reverse(char *str) {
char *start = str; //首元素地址
char *end = strlen(str) + str - 1; //最后一个元素地址
while (start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++; //头指针后移
end--; //尾指针前移
}
}
//回文判断
int str_back(char *str) {
char *start = str;
char *end = str + strlen(str) - 1;
while (start < end)
{
if (*start != *end)
{
return 0; //0表示非回文
}
start++;
end--;
}
return 1; //1表示回文
}
和字符串相关的都在string.h里面
包括字符串拷贝、拼接、比较、查找子串
字符串拷贝:strcpy()、strncpy()
char *strcpy(char *dest , const char *src),返回dst,拷贝的过程中要保证dest的空间足够大;如果dest空间不够大的话会溢出但是不会报错,能存多少存多少。(不安全)
strncpty(char **dest,const char *src,size_t n)
这里的n是与dest对应的空间一致,默认不添加\0
当n>src,只拷贝src的大小;
n<src,则拷贝n字节大小;
字符串拼接,strcat()、strncat()
char strcat(char dest ,const char *src):将src的内容拼接到dst之后,返回拼接之后的字符串
char p = strncat(char dest ,const char *src, size_t n); 将src的前n 个字符拼接到dest之后,形成一个新的字符串
字符串比较strcmp()、strncmp()
比较s1和s2两个字符串,如果相等,返回0,如果不相等进一步比较s1和s2对应位的ASCII码
若s1>s2返回1,s1<s2返回-1
,strncmp(s1, s2,size_t n) :n表示比较前n个字符,比的是ASCII的值,不比ASCII的和
格式化读入和写出sprintf、sscanf
sprintf的第一个参数是缓冲区,写入的东西都在缓冲区里,要打印出来的话就打印缓冲区名
sscanf同理。将原来从屏幕获取的格式化字符串,从参数1中获取
字符串查找子串strchr()、strrchr()
在字符串str中找一个字符出现的位置,返回的是字符在字符串中的地址
strchr(In_z char* const _String, In int const _Ch)
strrchr(In_z char* const _String, In int const _Ch)//从右向左找
strstr()
在字符串str中找子串substr的位置返回地址
strstr(In_z char* const _String, In_z char const* const _SubString)