strcpy
和 strdup
都是用于处理字符串的 C 函数,它们的功能相似,但用法略有不同。
strcpy
(String Copy):
strcpy
用于将一个字符串(字符数组)的内容复制到另一个字符数组中。- 它的原型为
char* strcpy(char* dest, const char* src)
。 dest
是目标字符串,src
是源字符串。strcpy
将src
的内容复制到dest
中,直到遇到空字符'\0'
为止。- 注意:
strcpy
不会检查目标数组是否足够大来容纳源字符串的内容,这可能导致缓冲区溢出。因此,在使用strcpy
时,必须确保目标数组足够大,以免发生溢出。
示例:
char source[] = "Hello, World!"; char destination[20]; strcpy(destination, source);
strdup
(String Duplicate):
strdup
用于复制一个字符串,并为新字符串分配足够的内存空间。strdup
并不是标准 C 函数,但它是一种常见的库函数,通常在 POSIX 环境中可用。strdup
的原型通常为char* strdup(const char* str)
。- 它接受一个源字符串
str
,并动态分配足够的内存来存储它,并将其内容复制到新分配的内存中。 - 返回值是指向新字符串的指针,你需要负责在使用后释放这个内存,通常使用
free
函数。
示例:
char source[] = "Hello, World!"; char* duplicate = strdup(source); // 使用 duplicate free(duplicate); // 释放内存,以避免内存泄漏
总结:
strcpy
用于在已分配的内存中复制字符串,需要手动分配目标数组的内存和确保足够大。strdup
用于复制字符串并动态分配内存,更方便,但需要手动释放内存以避免内存泄漏。
验证是否素数
先验证 ,且 ,接下来只需验证 与
int is_prime(int n) { if (n <= 1) return 0; if (n <= 3) return 1; if (n % 2 == 0 || n % 3 == 0) return 0; for (int i = 5; i * i <= n; i += 6) if (n % i == 0 || n % (i + 2) == 0) return 0; return 1; }
数组元素循环右移问题
注意 可能会大于 ,即 , 中大于 的 部分只是循环,并无意义, 令 即可,接下来只要从数组的第 项存第一个数, 项之后开始在数组的第一位存数字
- c 语言版
#include <stdio.h> int main() { int n = 0, m = 0, q = 0; scanf("%d %d", &n, &m); m = m % n; int a[n]; for (int i = 0; i < n; i++) { int t = 0; scanf("%d", &t); if (i < n - m) a[m + i] = t; else { a[i - (n - m)] = t; } } for (int i = 0; i < n; i++) { if (q == 0) { printf("%d", a[i]); q = 1; } else { printf(" %d", a[i]); } } }
- rust版
use std::io; fn main() { let mut input = String::new(); io::stdin().read_line(&mut input).expect("Can't read line"); let mut input = input.trim().split_whitespace(); let n: i32 = input.next().expect("Error").parse().expect("Not a num"); let mut m: i32 = input.next().expect("Error").parse().expect("Not a num"); m = m % n; let mut input = String::new(); io::stdin().read_line(&mut input).expect("Can't read line"); let mut a: Vec<i32> = input .trim() .split_whitespace() .map(|n| n.parse().expect("Not a num!")) .collect(); let len = a.len(); let vec_move = a.split_off(len - m as usize); a.splice(0..0, vec_move); a.into_iter().enumerate().for_each(|(idx, n)| { if idx == 0 { print!("{}", n) } else { print!(" {}", n); } }) }