微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试循环打印字符串时出现段错误

如何解决尝试循环打印字符串时出现段错误

我目前正在学习Zig(对C的经验很少),并且正在对字符串进行一些实验,以确保我正确地理解了这个概念。

例如,由于字符串是{ "name": "terior-api","version": "0.0.1","description": "","author": "","private": true,"license": "UNLICENSED","scripts": { "prebuild": "rimraf dist","build": "nest build","format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","start": "nest start","start:dev": "nest start --watch","start:debug": "nest start --debug --watch","start:prod": "node dist/main","lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix","test": "jest","test:watch": "jest --watch","test:cov": "jest --coverage","test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand","test:e2e": "jest --config ./test/jest-e2e.json" },"dependencies": { "@nestjs/common": "^7.0.0","@nestjs/config": "^0.5.0","@nestjs/core": "^7.0.0","@nestjs/jwt": "^7.1.0","@nestjs/passport": "^7.1.0","@nestjs/platform-express": "^7.0.0","@nestjs/typeorm": "^7.1.0","@types/bcrypt": "^3.0.0","@types/cookie-parser": "^1.4.2","@types/joi": "^14.3.4","bcrypt": "^5.0.0","class-validator": "^0.12.2","cookie-parser": "^1.4.5","joi": "^17.2.0","MysqL": "^2.18.1","passport": "^0.4.1","passport-jwt": "^4.0.0","reflect-Metadata": "^0.1.13","rimraf": "^3.0.2","rxjs": "^6.5.4","typeorm": "^0.2.25","yarn": "^1.22.5" },"devDependencies": { "@nestjs/cli": "^7.0.0","@nestjs/schematics": "^7.0.0","@nestjs/testing": "^7.0.0","@types/express": "^4.17.3","@types/jest": "25.2.3","@types/node": "^13.9.1","@types/supertest": "^2.0.8","@typescript-eslint/eslint-plugin": "3.0.2","@typescript-eslint/parser": "3.0.2","eslint": "7.1.0","eslint-config-prettier": "^6.10.0","eslint-plugin-import": "^2.20.1","jest": "26.0.1","prettier": "^1.19.1","supertest": "^4.0.2","ts-jest": "26.1.0","ts-loader": "^6.2.1","ts-node": "^8.6.2","tsconfig-paths": "^3.9.0","typescript": "^3.7.4" },"jest": { "modulefileExtensions": [ "js","json","ts" ],"rootDir": "src","testRegex": ".spec.ts$","transform": { "^.+\\.(t|j)s$": "ts-jest" },"coverageDirectory": "../coverage","testEnvironment": "node" } } 的数组,所以我发现可以使用以下代码来打印字符“ C”:

u8

然后我尝试进行循环以打印一些基本字符,其代码范围为33至126:

std.debug.print("{}",.{[_]u8{67}});

但是当我运行它时,会发生以下错误

var i: u8 = 33;
while (i < 127) {
    std.debug.print("{}",.{[_]u8{i}});
    i += 1;
}

最奇怪的是,当我稍稍更改代码以创建一个保存Segmentation fault at address 0x202710 /home/cassidy/learning-zig/hello-world/src/main.zig:9:39: 0x22ae15 in main (main) std.debug.print("{}",.{[_]u8{i}}); ^ /snap/zig/2222/lib/zig/std/start.zig:272:37: 0x204b9d in std.start.posixCallMainAndExit (main) const result = root.main() catch |err| { ^ /snap/zig/2222/lib/zig/std/start.zig:143:5: 0x2048df in std.start._start (main) @call(.{ .modifier = .never_inline },posixCallMainAndExit,.{}); ^ [1] 24766 abort (core dumped) ./main 数组的变量时,它就会按预期工作:

u8

返回:

var i: u8 = 33;
while (i < 127) {
    const c = [_]u8{i};
    std.debug.print("{}",.{c});
    i += 1;
}

有人可以解释为什么第二个代码触发段错误吗?

解决方法

询问Zig Discord之后,看来确实是一个错误。希望由于该语言仍在大量开发中而很快得到修复!

,

您遇到的是一个错误,但是仍然可以打印字符

执行此操作的标准方法是使用{c}打印字符(或一旦合并#6390{u}以将Unicode代码点打印为utf-8)

std.debug.print("{c}",.{i});

如果首先寻址,也可以用[_]u8{i}打印,因此它是*const [1]u8而不是[1]u8

std.debug.print("{}",.{&[_]u8{i}});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。