学习 › JavaScript
数据 · 12
拼接构建字符串
一段一段拼出字符串、用分隔符连接、在一行里连着输出。
要输出的字符串没法一次写出来时,就一段一段地拼出来。
下面的例子读入几个单词,依次输出由首字母组成的字符串、用逗号连接的单词,以及用空格隔开的各单词长度。
words = input().split()initials = ""for w in words: initials += w[0] # 한 조각씩 붙여 가요print(initials)print(", ".join(words)) # 사이에만 ", "lens = [len(w) for w in words]print(*lens) # 빈칸으로 이어 찍기const words = require("fs").readFileSync(0, "utf8").trim().split(/\s+/);let initials = "";for (const w of words) { initials += w[0]; // 한 조각씩 붙여 가요}console.log(initials);console.log(words.join(", ")); // 사이에만 ", "const lens = words.map((w) => w.length);console.log(lens.join(" ")); // 빈칸으로 이어 찍기import { readFileSync } from "node:fs";const words: string[] = readFileSync(0, "utf8").trim().split(/\s+/);let initials: string = "";for (const w of words) { initials += w[0]; // 한 조각씩 붙여 가요}console.log(initials);console.log(words.join(", ")); // 사이에만 ", "const lens: number[] = words.map((w) => w.length);console.log(lens.join(" ")); // 빈칸으로 이어 찍기import java.util.Scanner; public class Main { public static void main(String[] args) { String[] words = new Scanner(System.in).nextLine().trim().split(" +"); StringBuilder initials = new StringBuilder(); for (String w : words) { initials.append(w.charAt(0)); // 한 조각씩 붙여 가요 } System.out.println(initials); System.out.println(String.join(", ", words)); // 사이에만 ", " int[] lens = new int[words.length]; for (int i = 0; i < words.length; i++) lens[i] = words[i].length(); for (int i = 0; i < lens.length; i++) { if (i > 0) System.out.print(" "); // 첫 값 앞에는 안 찍어요 System.out.print(lens[i]); } System.out.println(); }}using System;using System.Text; class Program{ static void Main() { string[] words = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); var initials = new StringBuilder(); foreach (string w in words) { initials.Append(w[0]); // 한 조각씩 붙여 가요 } Console.WriteLine(initials); Console.WriteLine(string.Join(", ", words)); // 사이에만 ", " int[] lens = new int[words.Length]; for (int i = 0; i < words.Length; i++) lens[i] = words[i].Length; Console.WriteLine(string.Join(" ", lens)); // 빈칸으로 이어 찍기 }}#include <iostream>#include <string>#include <vector> int main() { std::vector<std::string> words; std::string w; while (std::cin >> w) words.push_back(w); std::string initials; for (const std::string& x : words) { initials += x[0]; // 한 조각씩 붙여 가요 } std::cout << initials << '\n'; for (size_t i = 0; i < words.size(); i++) { if (i > 0) std::cout << ", "; // 사이에만 ", " std::cout << words[i]; } std::cout << '\n'; std::vector<int> lens; for (const std::string& x : words) lens.push_back(x.size()); for (size_t i = 0; i < lens.size(); i++) { if (i > 0) std::cout << ' '; // 첫 값 앞에는 안 찍어요 std::cout << lens[i]; } std::cout << '\n';}#include <stdio.h>#include <string.h> int main(void) { char words[100][51], initials[101]; int n = 0, lens[100]; while (n < 100 && scanf("%50s", words[n]) == 1) n++; for (int i = 0; i < n; i++) { initials[i] = words[i][0]; // 한 조각씩 붙여 가요 } initials[n] = '\0'; // 문자열의 끝 표시 printf("%s\n", initials); for (int i = 0; i < n; i++) { if (i > 0) printf(", "); // 사이에만 ", " printf("%s", words[i]); } printf("\n"); for (int i = 0; i < n; i++) lens[i] = strlen(words[i]); for (int i = 0; i < n; i++) { if (i > 0) printf(" "); // 첫 값 앞에는 안 찍어요 printf("%d", lens[i]); } printf("\n"); return 0;}words = 控制台.读行().分割();initials = "";遍历 (w 在 words){ initials += w[0]; // 한 조각씩 붙여 가요}控制台.输出(initials);控制台.输出(words.连接(", ")); // 사이에만 ", "lens = [];遍历 (w 在 words){ lens.添加(w.长度);}控制台.输出(lens); // 목록은 빈칸으로 이어 찍어요red green blue
rgb red, green, blue 3 5 4
要点
- 拼接构建:从空字符串开始,在循环中把片段接到后面(
initials += w[0])。
这和用total += x累加求和是同一种写法。 - Java 和 C# 的
+=每次都会把到目前为止的字符串整个重新做一份。
所以它们另有 StringBuilder:先把片段攒起来,最后只转成一次字符串。 - 接上一个数时,有的语言会自动把它变成字符串,有的语言要自己先转换。
- 连接(join)只在列表各个值之间放入分隔字符串,合成一个字符串。
把red、green、blue用", "连接就是red, green, blue。
末尾不会多出分隔符。 - 没有连接功能的语言用循环来写。
只有不是第一个值时才先输出分隔符,再输出值,末尾就不会留下分隔符。 - 把几个数输出在一行也是同一件事。
有的语言有一次输出完的简短写法,有的语言要用不换行的输出一个一个地输出。
各语言的写法
| Python | 拼接用 s += 片段 — 数要先用 str(n) 转换。片段很多时,先 append 到列表里,最后 "".join(parts)。", ".join(words) 只接受字符串列表。一行输出用 print(*nums),要换分隔符用 print(*nums, sep=", ") |
|---|---|
| JavaScript | 拼接用 s += 片段 — 数会自动变成字符串。words.join(", ") 对数字数组也可以用,括号里什么都不写的 join() 用逗号连接。一行输出用 console.log(nums.join(" ")) |
| TypeScript | 和 JavaScript 一样 |
| Java | 先 StringBuilder sb = new StringBuilder();,再 sb.append(片段) — 字符、数、字符串都接受。最后用 sb.toString() 转换,或者直接 println(sb)。String.join(", ", words) 只接受字符串。数可以用 System.out.print 一个一个输出,或者攒到 StringBuilder 里 |
| C# | 先 var sb = new StringBuilder();(using System.Text;),再 sb.Append(片段),最后 sb.ToString()。string.Join(", ", words) 也接受数字数组,所以一行输出是 Console.WriteLine(string.Join(" ", nums)) |
| C++ | std::string 可以修改,所以 s += 片段 是原地追加。数要先用 std::to_string(n) 转换。没有连接功能,要用循环写成 if (i > 0) std::cout << ", ";。也可以用 << 攒到 std::ostringstream 里,再用 .str() 取出 |
| C | 字符串是 char 数组:留够空间,一格一格放入字符,最后放上 '\0'。追加字符串用 strcat(buf, "cd"),追加数用 sprintf(buf + len, "%d", n)。没有连接功能,用循环和 printf 来写 |
| Craykon | 拼接用 s += 片段 — 数会自动变成字符串。words.连接(", ") 对数字列表也可以用。控制台.输出(列表) 会用空格隔开输出,要一个一个输出时用不换行的 控制台.接着输出(值) |
常见错误
把分隔符接在了值的后面
words = ["red", "green", "blue"]
line = ""
for w in words:
line += w + ","
print(line)→ red,green,blue, — 末尾多了一个逗号
使用连接,或者只在不是第一个值时把分隔符接在值的前面:先 if line: line += ",",再 line += w。
直接连接数字列表Python · Java
print(", ".join([1, 2, 3]))→ Python 报 TypeError: sequence item 0: expected str instance, int found。Java 对 int[] nums 写 String.join(", ", nums) 也是编译错误
Python 用 ", ".join(map(str, nums)) 或 print(*nums, sep=", "),Java 攒到 StringBuilder 里。
JavaScript、C#、Craykon 的连接可以接受数。
用 + 连接两个引号字符串C · C++
char *s = "ab" + "cd";→ 编译错误 invalid operands to binary + — C 的字符串是地址,不能相加。C++ 中 std::string s = "ab" + "cd"; 也因为同样的原因是编译错误
C 写 char buf[10] = "ab"; strcat(buf, "cd");,C++ 把其中一边变成 std::string:std::string("ab") + "cd"。
各语言的差异
片段很多时,拼接的方式会让时间相差很大。
在与本站评测相同的环境里一个字符一个字符地拼接 20 万次,Java 用
Python 像例子那样在函数外用
JavaScript(Node.js)用
测得的时间因电脑而异。
另外,C++ 中追加数时一定要经过
片段很多时,拼接的方式会让时间相差很大。
在与本站评测相同的环境里一个字符一个字符地拼接 20 万次,Java 用
+= 约 1 秒,用 StringBuilder 是 1~2ms;C# 用 += 要 2~3 秒,用 StringBuilder 是 1~2ms。Python 像例子那样在函数外用
+= 拼接约 0.5 秒,先攒到列表里再 join 则不到 10ms。JavaScript(Node.js)用
+= 也只要 10ms 左右。测得的时间因电脑而异。
另外,C++ 中追加数时一定要经过
std::to_string:s += 65 追加的不是 "65",而是编码为 65 的字符 A。