作者:@匿名者Unit
字符串通常以\0作为结束标志,\0的ASCll码值为0,计算字符串长度时会忽略斜杠零。
在讲解题目之前我们先介绍几个关于字符串操作常用的几个库函数
strcpy也叫 拷贝函数 ,头文件为 string.h ,顾名思义它可以将一个字符串数组的内容拷贝到另一个数组中。
strcpy函数原型为:
char *strcat(char *dest, const char *src)
下面通过一段代码演示它的效果:
#include
#include int main()
{char ch[20] = "helloworld";char arr[10] = "xxxxxx";printf("%s", strcpy(ch, arr));return 0;
}
因为strcpy函数的返回值是拷贝后数组的地址,所以可以通过链式访问在屏幕上打印出xxxxxx,还需要注意的是拷贝函数目的数组要留够拷贝的空间不然程序会崩溃。
strcat函数称为追加拷贝函数 ,头文件为头文件为 string.h 。
strcat函数原型为:
char *strcat(char *dest, const char *src)
strcat可以找到目标数组的结束标志\0,并用起始数组代替\0。
我们还是用代码来演示他的效果:
#include
#include int main()
{char ch[15] = "likou";char arr[10] = "luogu";printf("%s", strcat(ch, arr));return 0;
}
结果:
这个函数同样需要在目标数组开辟足够的空间,才能 正常追加拷贝 。
strstr函数是字符串查找函数,文件为头文件为 string.h 。
函数原型为:
char *strstr( const char *arr1, const char *arr2 );
strstr函数可以在arr1数组中查找是否存在arr2数组中的内容,如果存在返回首次出现的地址,不存在则返回空指针 NULL。
下面用代码来演示下它的效果:
以上将几个要用得字符串函数讲解了,接下来我们看题目。
我们先根据题目写出整体的逻辑:
#include
#includechar in[101];char ch[101];int main()
{int n;scanf("%d", &n);scanf("%s", &ch);for (int i = 0; i < n; i++){int k = 0;scanf("%d", &k);if (k == 1){}else if (k == 2){}else if (k == 3){}else{}}return 0;
}
代码实现:
if (k == 1){scanf("%s", &in);printf("%s\n", strcat(ch, in));}
else if (k == 2){int a, b;scanf("%d %d", &a, &b);ch[a + b] = '\0';char in[101] = { 0 };strcat(in, &ch[a]); strcpy(ch, in);ch[b] = '\0';printf("%s\n", ch);}
因为在上一步操作中对in数组进行了输入,所以这里在使用in数组之前应该将in数组中的元素释放出来。
else if (k == 3){int a;//char in[101] = { 0 };scanf("%d %s", &a,&in);strcat(in, &ch[a]);ch[a] = '\0';strcat(ch, in);printf("%s\n", ch);}
上图代码逻辑雀氏妙,大家仔细体会。
else{//char in[101] = { 0 };scanf("%s",&in);char* ret = strstr(ch, in);printf("%d\n", ret != NULL ? (int)(ret-ch) : -1);}
这样用三目操作符 没想到吧?
下面完整代码奉上:
#include
#includechar in[101];char ch[101];int main()
{int n;scanf("%d", &n);scanf("%s", &ch);for (int i = 0; i < n; i++){int k = 0;scanf("%d", &k);if (k == 1){scanf("%s", &in);printf("%s\n", strcat(ch, in));}else if (k == 2){int a, b;scanf("%d %d", &a, &b);ch[a + b] = '\0';char in[101] = { 0 };strcat(in, &ch[a]); strcpy(ch, in);ch[b] = '\0';printf("%s\n", ch);}else if (k == 3){int a;//char in[101] = { 0 };scanf("%d %s", &a,&in);strcat(in, &ch[a]);ch[a] = '\0';strcat(ch, in);printf("%s\n", ch);}else{//char in[101] = { 0 };scanf("%s",&in);char* ret = strstr(ch, in);printf("%d\n", ret != NULL ? (int)(ret-ch) : -1);}}return 0;
}
在源码中可以发现我注释了几处释放in数组的操作,其实我当时在疑惑多次对in数组输入,为什么不需要在下一次之前将in的元素释放掉。真相是 即使数组中保留着上一次输入的字符串 scanf再次输入时 会在字符串后自动补上\0保证上一次的元素无法影响输出(在不越界的情况下)
以上就是这次的全部内容。