Skip to content

Instantly share code, notes, and snippets.

@alogic0
Last active April 9, 2023 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alogic0/cdb195c6ef0d65bf1dd8253976950a39 to your computer and use it in GitHub Desktop.
Save alogic0/cdb195c6ef0d65bf1dd8253976950a39 to your computer and use it in GitHub Desktop.
reverse utf-8 strings, codepoints only
const std = @import("std");
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
fn reverse_string(str: []const u8) ![]u8 {
var len = str.len;
var out = try allocator.alloc(u8, len);
var str_iter = (try std.unicode.Utf8View.init(str)).iterator();
var pos: usize = len;
while (str_iter.nextCodepointSlice()) |codepoint| {
pos -= codepoint.len;
std.mem.copy(u8, out[pos..], codepoint);
}
return out;
}
pub fn main() !void {
const stdin = std.io.getStdIn().reader();
const stdout = std.io.getStdOut().writer();
const stderr = std.io.getStdErr().writer();
while (true) {
//try stdout.writeAll("Введите строку: ");
// читаем 1 строчку из stdin
var line = try stdin.readUntilDelimiterOrEofAlloc(allocator, '\n', 128) orelse {
// прочитали уже после EOF
try stderr.writeAll("ввод прервался\n");
return;
};
defer allocator.free(line);
if (!std.unicode.utf8ValidateSlice(line)) {
try stderr.writeAll("мусор какой-то, а не юникод :)\n");
return error.NotUnicode;
}
// переворачиваем
var reversed = try reverse_string(line);
defer allocator.free(reversed);
// печатаем?
//try stdout.print("Перевернутая строка: {s}\n", .{reversed});
try stdout.print("{s}\n", .{reversed});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment