Tag: 字符串

c – 为什么将字符指针索引为int是有意义的?

char *a = “apple”; printf(“%s\n”, a); // fine printf(“%s\n”, a[1]); // compiler complains an int is being passed 为什么索引字符串指针给我一个int? 我期待它只是从第一个位置开始打印字符串(实际上当我使用&a[1]时会发生这种情况)。 为什么我需要获得地址?

构造哈希表/哈希函数

我想构建一个哈希表,查找从1到15个字节的字节序列(字符串)中的键。 我想存储一个整数值,所以我想一个哈希数组就足够了。 我很难概念化如何构造一个哈希函数,因为给定键会给出数组的索引。 任何援助都会受到很多关注。 散列中的最大条目数为:4081 * 15 + 4081 * 14 + … 4081 = 4081((15 *(16))/ 2)= 489720。 例如: int table[489720]; int lookup(unsigned char *key) { int index = hash(key); return table[index]; } 哈希函数有什么好的选择,或者我将如何构建一个? 谢谢。

在C中连接字符串的安全方法是什么?

我需要从两个字符串构造一个文件的路径。 我可以使用它(虽然没有经过测试): /* DON’T USE THIS CODE! */ /* cmp means component */ char *path_cmp1 = “/Users/john/”; char *path_cmp2 = “foo/bar.txt”; unsigned len = strlen(path_cmp1); char *path = path_cmp1; for (int i = 0; i < strlen(path_cmp2); i++) { path[len + i] = path_cmp2[i]; } 但这可能会导致内存损坏。 有没有更好的方法来做到这一点,或者标准库中是否有这样的function?

如何获取多字节字符串的字节大小

如何在Visual C中获取多字节字符串的字节大小? 有function还是我必须自己计算角色? 或者,更一般地说,如何获得TCHAR字符串的正确字节大小? 解: _tcslen(_T(“TCHAR string”)) * sizeof(TCHAR) 编辑: 我只是谈论以空字符结尾的字符串。

关于C字符串的问题

我是C的新手,我对C字符串非常困惑。 以下是我的问题。 从字符串中查找最后一个字符 如何找出字符串中的最后一个字符? 我带来了类似的东西, char *str = “hello”; printf(“%c”, str[strlen(str) – 1]); return 0; 这是要走的路吗? 我不知何故认为,这不是正确的方法,因为strlen必须遍历字符以获得长度。 因此该操作将具有O(n)复杂度。 将char转换为char* 我有一个字符串,需要附加一个字符。 我怎样才能做到这一点? strcat只接受char* 。 我试过以下, char delimiter = ‘,’; char text[6]; strcpy(text, “hello”); strcat(text, delimiter); 将strcat与具有局部范围的变量一起使用 请考虑以下代码, void foo(char *output) { char *delimiter = ‘,’; strcpy(output, “hello”); strcat(output, delimiter); } 在上面的代码中, delimiter是一个局部变量,它在foo返回后被销毁。 可以将它附加到变量output吗? strcat如何处理null终止字符? 如果我连接两个空终止字符串, strcat会将两个空终止字符附加到结果字符串吗? […]

如何检查char *是否指向C中的字符串文字

我有一个结构 struct request { int code; char *message; }; 我想要正确地自由。 我有以下function来做到这一点: void free_request(struct request *req) { if (req->message != NULL) { free(req->message); } free(req); req = NULL; } 问题是当我尝试释放使用字符串文字创建的请求时,我从编译器得到“free():invalid pointer”/ segfault错误: struct request *req; req = malloc(sizeof(struct request)); req->message = “TEST”; free_request(req); 因为我想在不同的地方创建请求结构,一旦使用文字(在客户端)和一次使用我从套接字读取的*字符(在服务器端)我想知道是否有一个函数来确保我不要试图释放文字,同时仍允许我释放我使用malloc创建的消息。

在C中初始化以NULL结尾的字符串数组的正确方法

这段代码是否正确? char *argv[] = { “foo”, “bar”, NULL };

如果char * s是只读的,为什么我可以覆盖它们?

我的课程告诉我,char * s是静态/只读的,所以我认为这意味着你在定义之后就无法编辑它们。 但是当我跑步时: char* fruit = “banana”; printf(“fruit is %s\n”, fruit); fruit = “apple”; printf(“fruit is %s\n”, fruit); 然后编译好并给我: fruit is banana fruit is apple 为什么? 我误解了只读是什么意思吗? 很抱歉,如果这是显而易见的,但我是新手编码,我无法在线找到答案。

在c中返回可变长度字符串的最佳实践

我有一个字符串函数,它接受指向源字符串的指针并返回指向目标字符串的指针。 这个function目前有效,但我担心我没有遵循重新编写malloc,realloc和free的最佳实践。 与我的函数不同的是,目标字符串的长度与源字符串不同,因此必须在我的函数内调用realloc()。 我从查看文档中了解到…… http://www.cplusplus.com/reference/cstdlib/realloc/ realloc后内存地址可能会改变。 这意味着我不能像C程序员那样“通过引用传递”其他函数,我必须返回新的指针。 所以我的function原型是: //decode a uri encoded string char *net_uri_to_text(char *); 我不喜欢我这样做的方式,因为我必须在运行函数后释放指针: char * chr_output = net_uri_to_text(“testing123%5a%5b%5cabc”); printf(“%s\n”, chr_output); //testing123Z[\abc free(chr_output); 这意味着在我的函数内部调用malloc()和realloc(),在函数外部调用free()。 我有高级语言的背景,(perl,plpgsql,bash)所以我的本能是对这些东西的正确封装,但这可能不是C中的最佳实践。 问题:我的方式是最佳实践,还是我应该采用更好的方法? 完整的例子 在未使用的argc和argv参数上编译并运行两个警告,您可以安全地忽略这两个警告。 example.c: #include #include #include char *net_uri_to_text(char *); int main(int argc, char ** argv) { char * chr_input = “testing123%5a%5b%5cabc”; char * chr_output = net_uri_to_text(chr_input); […]

有没有办法检查字符串是否可以是C中的浮点数?

检查它是否可以是一个int很容易 – 只需检查每个数字是否在’0’和’9′ 。 但浮动更难。 我找到了这个 ,但没有一个答案真的有效。 请考虑此代码段,基于顶部(已接受)答案: float f; int ret = sscanf(“5.23.fkdj”, “%f”, &f); printf(“%d”, ret); 1将被打印。 另一个答案建议使用strpbrk ,检查是否存在某些非法字符,但这不起作用,因为5fin7不合法,但inf会。 另一个答案建议检查strtod的输出。 但考虑一下: char *number = “5.53 garbanzo beans” char *foo; strtod(number, &foo); printf(“%d”, isspace(*foo) || *foo == ‘\0’)); 它会打印1 。 但我不想完全删除isspace调用,因为” 5.53 “应该是一个有效的数字。 是否有一种优秀,优雅,惯用的方式来做我想做的事情?