今天看到了拼接字符串的部分,这道题很好地比较了strcat函数和strncat函数的不同。strcat函数如果分配给第一个数组的空间不够大,则可能溢出,而strncat函数因为有第三个参数给出最大添加的字符数,则可以放心的拼接,到了最大添加字符数或遇到空字符就会停止。
代码如下:
#include<stdio.h>
#include<string.h>
#define SIZE 30
#define BUGSIZE 13
int main()
{
char * s_gets(char *st,int n); //声明一个将fgets修改了一下的输入函数
char addon[] = "s smell like old shoes.";
char flower[SIZE];
char bug[BUGSIZE];
int available;
puts("What's your favorite flower?");
s_gets(flower,SIZE);
if(strlen(flower) + strlen(addon) + 1 <= SIZE)
//+1是因为末尾要留一个空字符 此行控制不溢出
strcat(flower,addon);
puts(flower); //位置够就一起输出,不够就仅输出花名
puts("What's your favorite bug?");
s_gets(bug,BUGSIZE);
available = BUGSIZE - strlen(bug) - 1; //求出可添加的最大字符数 同样地,-1是减去末尾空字符
strncat(bug,addon,available); //在最大字符数范围内拼接
puts(bug);
return 0;
}
char *s_gets(char *st,int n)
{
char *ret_val;
int i = 0;
ret_val = fgets(st,n,stdin); //赋给新变量是因为要return 输入的字符串
if(ret_val) //先遇到\n就将换行符变为空字符,先遇到空字符就舍弃剩余字符
{
while(st[i] != '\n' && st[i] != '\0')
i++;
if(st[i] == '\n')
st[i] = '\0';
else
{
while(getchar() != '\n')
continue;
}
}
return ret_val;
}
这道题将目前经常用到的修改后的fgets输入函数和两个拼接字符串函数都用到了,希望好好记住,能熟练运用。
欢迎交流探讨。
谢谢。