题目:
7.strncpy(s1, s2, n)函数把s2中的n个字符拷⻉⾄s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的⻓度是n或多于n,⽬标字符串不能以空字符结尾。该函数返回s1。⾃⼰编写⼀个这样的函数,名为mystrncpy()。在⼀个完整的程序中测试该函数,使⽤⼀个循环给函数提供输⼊值。
思路:
1. 如题目要求设计拷贝函数,需要将S2中的n个字符拷贝到S1字符串中,假设S2字符串有ns个字符,涉及到2种情形,如果n<ns,正常拷贝,如果n>=ns,还是执行拷贝操作,但是S1无法以空字符结尾(可能需要相应的错误提示)。
2. 主程序循环提示用户输入字符串并进行拷贝,直到输入回车退出程序。
程序代码:
// 7.strncpy(s1, s2, n)函数把s2中的n个字符拷⻉⾄s1中,截断s2,或者有
// 必要的话在末尾添加空字符。如果s2的⻓度是n或多于n,⽬标字符串不能以空字符结
// 尾。该函数返回s1。⾃⼰编写⼀个这样的函数,名为mystrncpy()。在⼀个完整的程
// 序中测试该函数,使⽤⼀个循环给函数提供输⼊值。
#include
#include
#define LEN 50
char * s_gets(char * st, int n);
char * mystrncpy(char * str1, char * str2, int n);
void clear_str(char * st, int n);
int main()
{
char str1[LEN];
char str2[LEN];
int n;              //需要拷贝的字符数
int str2_len;       //字符串2实际长度
puts("Please enter source string(str2):");      //提示输入字符串
while(s_gets(str2, LEN) && str2[0] != '\0')     //输入回车跳出循环,输入函数s_gets()的原因,实际判断条件是'\0'
{
puts("Please enter copy quantity:");
scanf("%d",&n);
str2_len = strlen(str2);        //获取实际输入字符串的长度
if ( n = str2_len)
{
mystrncpy(str1, str2, n);
puts("Warning, copied string maybe has error!");
puts(str1);
clear_str(str1, LEN);
clear_str(str2, LEN);
}
puts("Please enter next source string(str2):");
s_gets(str2, LEN);
}
puts("Done.");      //回车结束显示Done。
return 0;
}
char * mystrncpy(char * str1, char * str2, int n)
{
int i = 0;
for (i = 0; i < n && str2[i] != '\0'; i++)
str1[i] = str2[i]; // 逐个字符拷贝,直到str2结束或达到n个
for (; i < n; i++)
str1[i] = '\0'; //若str2长度
程序代码2(AI编写,逻辑清晰):
#include
#include   // 用于 strlen 函数(仅测试用,mystrncpy 未依赖)
#define MAX_INPUT_LEN 50  // 输入字符串的最大长度,避免缓冲区溢出
// 自定义 strncpy 函数:将 s2 的前 n 个字符拷贝到 s1,返回 s1
char *mystrncpy(char *s1, const char *s2, size_t n) {
char *original_s1 = s1;  // 保存 s1 首地址(用于最终返回)
size_t i;                // 循环计数器(用 size_t 匹配字符串长度类型)
// 第一步:拷贝 s2 的字符到 s1,最多拷贝 n 个
for (i = 0; i  0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
return str;
}
int main() {
char source[MAX_INPUT_LEN];    // 源字符串缓冲区
char target[MAX_INPUT_LEN];    // 目标字符串缓冲区
size_t copy_len;               // 待拷贝的长度
char continue_flag;            // 循环控制:是否继续测试
printf("=== 自定义 mystrncpy 函数测试 ===\n");
do {
// 1. 输入源字符串
printf("\n请输入源字符串(最长 %d 个字符):", MAX_INPUT_LEN - 1);
safe_gets(source, MAX_INPUT_LEN);
// 2. 输入拷贝长度(需确保为非负整数)
printf("请输入拷贝长度 n(非负整数):");
while (scanf("%zu", ©_len) != 1 || copy_len >= MAX_INPUT_LEN) {
// 输入非法(非数字或长度超出缓冲区)时,清空输入缓存并提示重输
while (getchar() != '\n');  // 清除输入流中的无效字符
printf("输入错误!n 需为非负整数且小于 %d,请重新输入:", MAX_INPUT_LEN);
}
while (getchar() != '\n');  // 清除 scanf 残留的换行符
// 3. 调用 mystrncpy 拷贝字符串
mystrncpy(target, source, copy_len);
// 4. 输出结果(含关键信息:源字符串、拷贝长度、目标字符串及细节)
printf("\n--- 测试结果 ---");
printf("\n源字符串:\"%s\"(长度:%zu)", source, strlen(source));
printf("\n拷贝长度:%zu", copy_len);
printf("\n目标字符串:\"%s\"", target);
// 额外提示:若目标字符串无结束符(s2 长度 ≥n),需特别说明
if (strlen(source) >= copy_len && copy_len > 0) {
printf("(注意:目标字符串无结束符,直接打印可能出现乱码)");
}
printf("\n");
// 5. 询问是否继续测试
printf("\n是否继续测试?(y/n):");
scanf("%c", &continue_flag);
while (getchar() != '\n');  // 清除 scanf 残留的换行符
} while (continue_flag == 'y' || continue_flag == 'Y');  // 输入 y/Y 则继续
printf("\n测试结束!\n");
return 0;
}
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号