【发布时间】:2026-01-21 17:55:01
【问题描述】:
我有一个像“1234567890”这样的字符串。现在我需要用以下格式存储/打印出来, 123-456-7890
在 C 中实现这一点的最佳方法是什么?
感谢 cmets/answers。
【问题讨论】:
-
这是家庭作业吗?
我有一个像“1234567890”这样的字符串。现在我需要用以下格式存储/打印出来, 123-456-7890
在 C 中实现这一点的最佳方法是什么?
感谢 cmets/answers。
【问题讨论】:
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]);
【讨论】:
您可以逐个复制字符,同时保留复制字符数的计数器。在复制一个字符之前,检查计数器是 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);
【讨论】:
不用多说,如果这是家庭作业...您可能想要使用的是 strncpy 和 strcat 的组合(以及 string.h)。
由于 C 中处理字符串的方式,您需要引用字符串中的起始点才能开始复制。例如,
strncpy (dest, src + startPos, copyLength)
【讨论】:
您可以使用 realloc 重新分配字符串缓冲区(它不在堆栈上,是吗?)然后 memmove 来移动必要的字符。
【讨论】:
关于什么是“最好的”,将有两种思想流派。
一所学校说,只要它功能强大且安全,任何使用最少资源(内存和处理器周期)的方法都是“最好的”。
一所学校说,只要它功能强大且安全,任何最容易阅读和维护的方法(尽管它可能效率低下)都是“最好的”。
编辑:编辑我的答案,因为我不喜欢给家庭作业问题提供代码答案
正如其他答案和 cmets 所建议的那样,最好阅读 string.h 和 printf / sprintf 的文档。
【讨论】:
C 是一种相当“古老”的语言(属于七十年代),在其标准库中具有字符串操作函数,如 strcat、strcpy 等。
只要看string.h头文件参考就够了。
编辑:如果可以的话,我建议你使用更高级的语言,比如 C++,它有更强大的结构,比如 std::string 类。现在几乎所有操作系统和平台都应该有一个 C++ 编译器,包括嵌入式系统。
【讨论】: