【问题标题】:How to remove first 80 characters form a char array?如何从 char 数组中删除前 80 个字符?
【发布时间】:2021-10-10 10:50:17
【问题描述】:

我有我的 char 数组,最大大小为 1024。无论如何它包含一个 200 个字符的字符串。我想从这 200 个字符串中删除前 80 个字符。我该怎么做?

    char my_array[1024];
     for(int i = 80; i < sizeof(my_array); i+=1)
 {
    my_array[i-80] = my_array[i];
 }

我试过这个,但它不起作用。你知道任何解决方案吗?谢谢大家的帮助!

【问题讨论】:

  • 怎么不行?发生什么了?你期望会发生什么?你怎么检查? 您的编译器是否有任何警告?
  • sizeofmax_array一起工作
  • 抱歉,这是一个疏忽。显然在大括号内的数组也是 my_array
  • 你真的删除它吗?或者你只是想要一个在 80 chars 之后开始的字符串?如果是后者,则只需创建一个指向数组中间的指针即可。
  • 字符是什么意思?

标签: arrays c char c-strings


【解决方案1】:

使用标准 C 字符串函数memmove。例如

#include <string.h>

//...

memmove( my_array, my_array + 80, strlen( my_array ) - 79 );

幻数79 表示您需要复制字符串中除80 字符之外的所有字符,但包括终止零字符'\0'

您需要保证该数组确实包含一个字符串,并且存储的字符串的长度(strlen( my_array ))不小于80 个字符。

例如

size_t n = strlen( my_array );
if ( !( 80 < n ) )
{
    myarray[0] = '\0';
}
else
{
    memmove( my_array, my_array + 80, n - 79 );
}

这是一个演示程序,它从存储在字符数组中的字符串中删除前 7 个字符。

#include <string.h>
#include <stdio.h>

int main( void ) 
{
    char s[] = "Hello World";
    size_t n = 6;
    
    puts( s );
    
    memmove( s, s + n, strlen( s ) - n + 1 );
    
    puts( s );
}

程序输出是

Hello World
World

【讨论】:

  • 这不需要删除 80 个字符。它删除了 80 个chars,但一个字符可能需要多个char
  • @12431234123412341234123 sizeof(char) 始终等于 1。
  • 是的,但这与我的评论无关。我的观点是,一个角色可能需要超过 1 个char。单个字符可以是多个 Unicode 码位的组合,一个 Unicode 码位可以长于 1 个char。他并没有要求删除 80 个chars 的方法,他要求的是 80 个字符(这实际上并不那么容易定义)。
  • @12431234123412341234123 问题中没有提到其他编码系统。
  • 大多数使用某种有意义的编码形式的系统(意味着,不是只使用字节、整数等的简单微控制器)使用的编码不是 1 char == 1 个字符.所以char和character的区别是有意义的,应该注意。当你的意思是char时,不要说字符。当您将字符串更改为 "?üa0123456789" 时,只会删除 "?ü"(假设为 UTF8),而不是 6 或 7 个字符,因为您的文本错误地说。 s/character/char/ 你的答案是正确的。
【解决方案2】:

您可以根据需要创建一个指向原始字符串的第 81 个 char 的指针,而不是更改数组,该指针现在指向删除了 80 个 char 的字符串。这是一个较短的示例,仅删除了 10 个 chars。

int main(void)
{
  char orig[]="This is a long string";
  char *s=orig+10;
  puts(s);
  return 0;
}

这将打印出来

long string

字符计数问题:

您说过要删除字符。一个char 和一个字符不一样,定义起来并不简单,也很难计数。首先,你要知道CHAR_BIT的编码和值。您很可能会使用 UTF-8 和 CHAR_BIT==8。计数代码点相对容易,只需计数表示代码点开始的chars(第7位为0或第6位设置)。但随后它变得复杂。您需要注意combining characters,它们是与其他代码点组合以创建单个字符的代码点。这也更难,因为根据上下文,无法组合角色。然后你需要定义你的计数方式。例如,在韩语中,多个简单的“字符”可以通过将它们放在一个正方形中组合成一个“字符”,您如何计算它们? (免责声明我不懂韩语,也不太了解韩语的工作原理。)

计数字符超出了这个答案,我只想告诉你“删除 80 个字符”并不容易定义。

【讨论】:

    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2015-01-12
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多