【问题标题】:Inserting a character into a char array将字符插入 char 数组
【发布时间】:2021-12-20 18:52:52
【问题描述】:

我有一个包含数字的 char 数组。

char number[] = "12000000"

我需要有一个函数来插入每 3 位数的分隔符。喜欢:

char result[] = "12,000,000"

我的函数接受数字作为char pointer,它也需要以char pointer 的形式返回结果。

  char* insert_divider(char* number) {

    some magic;
    return result;
  } 

我不知道如何使用指针。谢谢。

【问题讨论】:

  • 字符串是如何终止的?数组是否足够大以容纳新字符串?
  • 我尝试了很多方法,似乎它以 \0 终止。此数字数组最多为 14 位。
  • 您通常不会插入到 C 样式的数组中。您只能重用已经存在的数组元素。您不能添加到元素的数量。您只能希望最后有一些未使用的,然后将已经使用的移动到它们之间以保留未使用的。这就是你要问的吗?还是你希望做添加元素的事情?
  • (1)使用strlen计算输入长度,乘以2。(2)使用char *result = malloc(size)分配足够的内存(3)写一个for循环复制字符到result 确保 result 以空值结尾。查看一些example 以开始使用。
  • 试试这个int len = strlen(input); for(int i = 0; i < len; i++) printf("%c", input[i]);。然后将字符插入result[i]。注意result 不能是“数组”,因为该数组在函数返回时被销毁。它必须是一个指针,它的内存分配有malloc

标签: arrays c pointers arduino char


【解决方案1】:

这是另一种方法:

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

char* insert_divider(char* number, size_t length) {
    int j = length + length/3; // every 3 digits a ',' will be inserted
    char *out = (char*)malloc(j + 1);

    out[j--] = '\0';

    for (int i = length - 1, k = 1; i >= 0; i--, k++) {
        out[j--] = number[i];
        if ((k%3) == 0) {
            out[j--] = ',';
        }
    }

    return out;
}

int main(){
    char number[] = "12000000";
    char *outNumber = insert_divider(number, strlen(number));
    printf("%s", outNumber);
    free(outNumber);
    return 0;
}

【讨论】:

    【解决方案2】:

    我想出了这段代码:

      char *result;
      result = (char*) malloc(15);
      int len= strlen(input);
      uint8_t cursor= 0;
      for(int i = 0; i < len; i++) {
        if ((len- i) > 0 && (len- i) % 3 == 0) {
          result[i + cursor] = ',';
          cursor++;
        }
        result[i + cursor] = input[i];
      }
      result[len+ cursor] = '\0';
    

    感谢大家的帮助和建议。

    【讨论】:

    • 对于112000000,您会在索引零处获得一个额外的,。尝试更改为if (i &amp;&amp; (len - i) % 3 == 0)。另外,我建议更改为result = malloc(len * 2);,然后它可以处理任何数字。不再需要时不要忘记致电free(result)
    【解决方案3】:

    这里有一个函数,它从末尾开始每隔num 个字符添加一个char c。您需要确保字符串缓冲区足够长以容纳修改后的字符串。

    char *addEvery(char *str, char c, unsigned num)
    {
        char *end = str;
    
        if(str && *str && num)
        {
            size_t count = 1;
            while(*(end)) end++;
            while(end != str)
            {
                end--;
                count++;
                if(!(count % (num + 1)) && str != end)
                {
                    memmove(end + 1, end, count);
                    *end = c;
                    count++;
                }
            }
        }
        return str;
    }
    
    int main(void)
    {
        char str[100] = "120000000000";
        printf("%s", addEvery(str,',',3));
    }
    

    【讨论】:

    • addEvery() 绝对应该将缓冲区长度作为参数并拒绝写入缓冲区的末尾。否则一场灾难就等着发生……
    • 必须为 OP 留下一些东西
    • 你所剩无几。
    猜你喜欢
    • 2019-04-09
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2016-02-05
    相关资源
    最近更新 更多