strcpy 和 strdupPage Cover
strcpy 和 strdup
November 6th 20234 min read788 words

strcpystrdup 都是用于处理字符串的 C 函数,它们的功能相似,但用法略有不同。

strcpy(String Copy):

  • strcpy 用于将一个字符串(字符数组)的内容复制到另一个字符数组中。
  • 它的原型为 char* strcpy(char* dest, const char* src)
  • dest 是目标字符串,src 是源字符串。
  • strcpysrc 的内容复制到 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 用于复制字符串并动态分配内存,更方便,但需要手动释放内存以避免内存泄漏。

验证是否素数

先验证 1231、2、3,且 6=236=2*3,接下来只需验证 6n16n-16n+16n+1

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; }

数组元素循环右移问题

注意 MM 可能会大于 NN,即 M=kN+aM=kN+aMM 中大于 NNkNkN 部分只是循环,并无意义, 令 MMmodNM \equiv M \mod N 即可,接下来只要从数组的第 MM 项存第一个数,nmn - m 项之后开始在数组的第一位存数字

  • 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); } }) }

end