【问题标题】:string separation and formatting in CC中的字符串分离和格式化
【发布时间】:2026-01-21 17:55:01
【问题描述】:

我有一个像“1234567890”这样的字符串。现在我需要用以下格式存储/打印出来, 123-456-7890

在 C 中实现这一点的最佳方法是什么?

感谢 cmets/answers。

【问题讨论】:

  • 这是家庭作业吗?

标签: c string


【解决方案1】:
printf("%c%c%c-%c%c%c-%c%c%c%c"
  , s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9]);

【讨论】:

  • +1 是一个简单易读的解决方案,在有限的范围内完全可以接受。
【解决方案2】:

您可以逐个复制字符,同时保留复制字符数的计数器。在复制一个字符之前,检查计数器是 3 还是 6;如果是这样,在输出中写一个破折号('-')。这将确保根据需要对数字进行分组:

const char* input = "1234567890";
char output[20];  // allocate a buffer big enough to fit the result

const char* src = input;  // the current source byte
char* dst = output;       // the current destination
int charsCopied = 0;      // counter

// loop until we reach the terminating NUL of the source string
while (*src) {

    // insert the dash in the output when needed
    if (charsCopied == 3 || charsCopied == 6) {
        *dst++ = '-';
    }

    // copy the current character and move to the next
    *dst++ = *src++;
    charsCopied += 1;
}

// terminate the output string and print it
*dst = '\0';
puts(output);

【讨论】:

    【解决方案3】:

    不用多说,如果这是家庭作业...您可能想要使用的是 strncpy 和 strcat 的组合(以及 string.h)。

    由于 C 中处理字符串的方式,您需要引用字符串中的起始点才能开始复制。例如,

    strncpy (dest, src + startPos, copyLength)
    

    【讨论】:

      【解决方案4】:

      您可以使用 realloc 重新分配字符串缓冲区(它不在堆栈上,是吗?)然后 memmove 来移动必要的字符。

      【讨论】:

        【解决方案5】:

        关于什么是“最好的”,将有两种思想流派。

        一所学校说,只要它功能强大且安全,任何使用最少资源(内存和处理器周期)的方法都是“最好的”。

        一所学校说,只要它功能强大且安全,任何最容易阅读和维护的方法(尽管它可能效率低下)都是“最好的”。

        编辑:编辑我的答案,因为我不喜欢给家庭作业问题提供代码答案

        正如其他答案和 cmets 所建议的那样,最好阅读 string.h 和 printf / sprintf 的文档。

        【讨论】:

        • 您可以使用“%.#s”,其中#是要打印的最大字符数。
        【解决方案6】:

        C 是一种相当“古老”的语言(属于七十年代),在其标准库中具有字符串操作函数,如 strcat、strcpy 等。

        只要看string.h头文件参考就够了。

        编辑:如果可以的话,我建议你使用更高级的语言,比如 C++,它有更强大的结构,比如 std::string 类。现在几乎所有操作系统和平台都应该有一个 C++ 编译器,包括嵌入式系统。

        【讨论】:

        • 您会惊讶于字符串构造不可用的应用程序的数量。在游戏行业尤其如此。了解字符串如何作为 char 数组工作并不是一个坏主意,尤其是当它引发诸如 mem 之类的各种问题时。管理等
        最近更新 更多