c - c中的局部变量和内存
问题描述
我C
对内存分配有些陌生,并且想知道某些事情。我的功能如下:
size_t count_nwords(const char* str) {
//char* copied_str = strdup(str); // because 'strtok()' alters the string it passes through
char copied_str[strlen(str)];
strcpy(copied_str, str);
size_t count = 1;
strtok(copied_str, " ");
while(strtok(NULL, " ") != 0) {
count++;
}
//free(copied_str);
return count;
}
该函数计算字符串中的单词数量(分隔符是空格,即“ ”)。我不希望修改传入参数的字符串。
我有两个问题:
- 方式(这是代码中的注释部分)是否应该
strdup()
优于strcpy()
一种方式?我的理解是strcpy()
足够和更快,但我不确定。 - 由于没有为
size_t
要返回的值分配内存(它是一个局部变量),是否应该这样做以确保函数是健壮的?还是使用size_t nwords = count_nwords(copied_input);
完全安全并且总是能正确获得返回值?
谢谢!
编辑:我已经接受了与我的问题完全相关的唯一答案,但我建议阅读其他答案,因为它们对我在代码中犯的错误提供了很好的见解。
解决方案
未能考虑空字符
// char copied_str[strlen(str)];
char copied_str[strlen(str) + 1];
strcpy(copied_str, str);
错误的算法
即使有上述修复,代码也会返回 1count_nwords(" ")
不必要的字符串复制
strtok()
这里不需要。不需要字符串的副本。
替代方案:走线。
size_t count_nwords(const char* str) {
size_t count = 0;
while (*str) {
while (isspace((unsigned char) *str)) {
str++;
}
if (*str) {
count++;
while (!isspace((unsigned char) *str) && *str) {
str++;
}
}
}
return count;
}
推荐阅读
- database - 从数据库加载大块文本文件
- python - 数据不绘图有问题
- c++ - 为什么我的 LinkedList 在我的列表末尾读取一个额外的节点?
- c# - 我如何检查我的价值是否与其他人匹配,例如配对游戏
- amazon-web-services - 如何在 Route53 中为单个域的每个环境(阶段、产品)创建不同的 DNS 记录?
- node.js - 一些网站如何避免响应从 node.js 内部发出的 https 请求?
- android - ng-selected 属性不适用于 ion-select
- unity3d - 制作一个编辑脚本对象的工具
- python - 计算月份天数的python程序
- javascript - JQUERY post method always return to first table