Python 如果所有字符串都需要长度或空终止符,那么高级语言如何只使用字符构造字符串?
所以我写了一些C代码来模拟一种脚本语言。 我遇到了这样一个场景:如果我运行一个函数来导入一个文件,比如说Python 如果所有字符串都需要长度或空终止符,那么高级语言如何只使用字符构造字符串?,python,c,go,Python,C,Go,所以我写了一些C代码来模拟一种脚本语言。 我遇到了这样一个场景:如果我运行一个函数来导入一个文件,比如说import(“file.c”)我遇到了一个问题,我不一定能使用指针,因为它不是以null结尾的。我还需要给出字符串的长度,如import(“file.c”,5)或使用空终止字符import(“file.c\0”)。我假设使用缓冲区是使用固定大小的方式,例如char file\u name[256],它可能覆盖足够大的文件名。但这就提出了一些关于“更高”级别编程语言(比如Python或Gola
import(“file.c”)
我遇到了一个问题,我不一定能使用指针,因为它不是以null结尾的。我还需要给出字符串的长度,如import(“file.c”,5)
或使用空终止字符import(“file.c\0”)
。我假设使用缓冲区是使用固定大小的方式,例如char file\u name[256]
,它可能覆盖足够大的文件名。但这就提出了一些关于“更高”级别编程语言(比如Python或Golang)的有趣问题。因此,从互联网搜索来看,Golong的进口产品是这样的:
import (
"fmt"
"math"
)
我假设库被视为字符串,不是吗?Python呢
import pandas as pd
import math
import functools
这些也被视为字符串吗?至少,对我来说,我认为golang的进口产品是。
但让我们完全忘记进口。那就用绳子怎么样?
Python的字符串是:
s = "I like Apple Pie"
我看到golang中的字符串定义为:
type _string struct {
elements *byte // underlying bytes
len int // number of bytes
}
下一段代码是:
const World = "world"
在没有指定len的情况下。有什么好处
golang或一般的“更高级”语言如何使用字符串,而不必指定以null结尾的字符串或带数字的长度?还是我完全错过了什么
我有一些C语言的Python背景,但在今天的大多数编程语言中它似乎非常相似。Go中的字符串值是指向字节和长度的指针。这是: 对于像
“world”
这样的字符串文本,编译器计算字节数以设置长度。该文本在运行时由StringHeader{Data:pointerToBytesWorld,Len:5}
表示
对于通过切片表达式的字符串值,长度在切片操作数中是隐式的:
s := "Hello"
s = s[1:4] // length is 4 - 1 = 3
字符串转换采用操作数的长度:
b := []byte{'F', 'o', 'p'}
s = string(b) // length is 3, same as len(b)
不编写字符串长度或字符串文本的null终止字符并不意味着不能自动完成:编译器可以这样做(因为它在编译时知道字符串长度),而且很可能会这样做 例如: 空字符('\0',L'\0',char16\u t()等)始终为空 附加到字符串文字:因此,字符串文字“Hello”是 常量字符[6],包含字符“H”、“e”、“l”、“l”、“o”和 “\0” 下面是一个小型C程序,它显示将空字符附加到字符串文字:
#include <stdio.h>
#include <string.h>
int main()
{
char *p="hello";
int i;
i = 0;
while (p[i] != '\0')
{
printf("%c ", p[i]);
i++;
}
printf("\nstrlen(p)=%ld\n", strlen(p));
return 0;
}
您还可以在调试模式下使用以下命令编译程序:
gcc -g -o hello -Wall -pedantic -Wextra hello.c
并与gdb检查:
gdb hello
...
(gdb) b main
Breakpoint 1 at 0x400585: file hello.c, line 6.
(gdb) r
Starting program: /home/pifor/c/hello
Breakpoint 1, main () at hello.c:6
6 char *p="hello";
(gdb) n
9 i = 0;
(gdb) print *(p+5)
$7 = 0 '\000'
(gdb) print *(p+4)
$8 = 111 'o'
(gdb) print *p
$10 = 104 'h'
你能澄清你的问题吗?您的标题正确地表示“字符串需要长度或[…]终止符”。Golang示例结构/类型有一个长度,源代码
“world”
显然有一个开始和结束符号。好的,明白了,所以nul终止符是在后台追加的。我想大多数语言都是在后台这样做的,它们要么获取长度,要么在用户不知道的情况下追加空终止符。你有没有一个C代码示例来演示如何自动追加空终止符。看起来链接显示了c++我在回答中添加了一个c示例。好的,我明白了,所以golang正在幕后发送长度。很有趣,谢谢!
gcc -g -o hello -Wall -pedantic -Wextra hello.c
gdb hello
...
(gdb) b main
Breakpoint 1 at 0x400585: file hello.c, line 6.
(gdb) r
Starting program: /home/pifor/c/hello
Breakpoint 1, main () at hello.c:6
6 char *p="hello";
(gdb) n
9 i = 0;
(gdb) print *(p+5)
$7 = 0 '\000'
(gdb) print *(p+4)
$8 = 111 'o'
(gdb) print *p
$10 = 104 'h'