假定您确实希望复制字符串,那么可以使用strcpy ()函数和strncpy ()函数。
/* copyl.c __ strcpy ()示例程序*/
#include<stdio.h>
#include<string.h>/* 声明 strcpy ()函数 */
#define SIZE 40
#define LIM 5
#define TARGSIZE 7
int main(void)
{
char qwords[LIM][SIZE];
char qwords1[LIM][SIZE];
char temp[SIZE];
int i=0;
printf("enter %d words beginning with q\n",LIM);
while(i<LIM&&gets(temp))
{
if(temp[0]!='q')
{
printf("%s doesn't begin wirh q!\n",temp);
}
else{
strcpy(qwords1[i],temp);
strncpy(qwords[i],temp,TARGSIZE-1);
qwords[i][TARGSIZE-1]='\0';
i++;
}
}
puts("Her are the words accepted:");
for(i=0;i<LIM;i++)
{
puts(qwords[i]);
puts(qwords1[i]);
}
return 0;
}
输出结果:
请注意只有当输入的单词通过了q判断,计数值i才会增加。还要注意程序使用了一个基于字符的判断:
if (temp[0] != 'q')
这相当于,temp数组的第一个字符是否不为q?还可以使用一个基于字符串的判断:
if (strncmp (temp, "g", 1) != 0)
这相当于,字符串temp和字符串”q”的第一个元素是否不同?
注意,第二个参数temp指向的字符串被复制到第一个参数qwordfi]指向的数组中。复制的那份字符串 被称为目标(target)字符串,最初的字符串被称为源(squrce)字符串。如果注意到它和賦值语句的顺序 一样,目标字符串在左边,就容易记住参数的顺序。
总之,strcpy ()接受两个字符串指针参数。指向最初字符串的第二个指针可以是一个己声明的指 针、数组名或字符串常量。指向复制字符串的第一个指针应指向空间大到足够容纳该字符串的数据对 象,比如一个数组。记住,声明一个数组将为数据分配存储空间;而声明一个指针只为一个地址分配 存储空间。
strcpy ()和gets ()函数同样都有一个问题,那就是都不检査目标字符串是否容纳得下源字符串。 复制字符串使用strncpy ()比较安全。它需要第三个参数来指明最大可复制的字符数。
函数调用strncpy (target, source, n)从source把n个字符(或空字符之前的字符,由二者中最先满 足的那个决定何时终止)复制到target。因此,如果源字符串的字符数比n小,整个字符串都被复制过来, 包括空字符。函数复制的字符数绝不会超过n,因此如果源字符串还没结束就达到了限制,就不会添加空 字符。结果,最终的字符串可能有也可能没有空字符。出于这个原因,程序设置的n比目标数组的大小要 少1,这样就可以把空字符放到数组的最后一个元素里。
strncpy (qwordsfij. temp, TARGSIZE - 1):
qwords[i][TARGSIZE - 1] = '\0':
这就确保您已经存储了一个字符串。如果源字符串确实可以容纳得下,和它一起复制的空字符就 标志着字符串的真正结束。如果源字符串在目标数组中容纳不下,这个最后的空字符就标志着字符串 的结束。