披露:这是大学工作。我不希望代码完成我的任务,而是想了解如何最好地操作C中的字符串。
我需要编写一个函数来以某种方式操作字符串(我不是说什么,以确保没有人提供确切的代码)。
在python中我只做以下
def foo(str):
return str
显然事情并不像C中那么容易。
有谁能告诉我如何最好地实现这一目标。我应该使用指针来模拟通过引用传递并只是操纵原始字符串吗?任何帮助/资源将不胜感激。
更新:我确实希望对字符串执行操作并返回该操作的结果(也是字符串)。我很乐意操纵原始字符串或返回它。哪个被认为是最佳实践。
我设置的任务是基于如何进行操作,所以我不想明确这样做。
所以Python将是:
def foo(str):
#do something to str (which doesn't change it's length)
return str
答案 0 :(得分:5)
有两种方法:
strdup
或malloc + strcpy
复制该字符串,并向其返回指针(char *
)。调用者当然必须free
完成后。这一切都取决于问题:调用者是否需要原始字符串?
答案 1 :(得分:1)
有许多惯例,但最常见的似乎是:
void foo(char *destination, const char *source);
或
void foo(char *destination, size_t dest_len, const char *source);
所以你将source
中的原始字符串作为const
传递(它不会被函数修改),输出字符串写在destination
中。
当然,调用者需要确保destination
的大小足够大,否则调用会导致未定义的行为。
答案 2 :(得分:0)
这应该适用于C:
char* foo(char *str)
{
return str;
}
或者只是:
void foo(char *str)
{
}
因为你实际上并没有碰到str。
如果您想了解C,并在没有帮助的情况下完成作业,请自行获取K&R的副本。立即!
答案 3 :(得分:0)
通常,您的函数应使用malloc
分配所需大小的字符串。例如,这是一个重复每个字符的函数:
def repeat_each(char* s) {
char* res = malloc(strlen(s) * 2 + 1);
if (!res) return res;
char* resp = res;
while (*s) {
*resp++ = *s;
*resp++ = *s;
s++;
}
return res;
}
调用者对free
返回的字符串负责。注意不要在循环中调用strlen
。如果您需要多次,请将其存储在size_t
类型的临时变量中。
答案 4 :(得分:0)
如果我明白你想要什么,那就是这样的:
void foo(char *str /* , int n */) {
// do something
// str[3] = 'c';
}
请记住,您不能超过该字符串的已分配空间。因此,可选的int用于指定长度。
如果您想更改字符串,但仍将其保留在原始存储空间中。
如果你想要一个基于现有字符串的新字符串,那么:
char* foo(char *str /* , int n */) {
char *ret = malloc(/* what you need */);
// do something, probably copy str to ret
return ret;
}
答案 5 :(得分:0)
我认为你的问题的答案是你需要一个基本的理解如何在C中表示字符串。一旦你得到它,处理应该不再那么困难。
我建议阅读
http://cplus.about.com/od/learningc/ss/strings.htm
(我能提出的第一个对我来说合理的网址)
祝你好运。答案 6 :(得分:0)
在C语言中,您可能还需要传递可在字符串中使用的最大大小。
char *fill_with_dots(char *data, size_t len) {
char *dst = data;
while (--len) *dst++ = '.';
*dst = 0;
return data;
}
答案 7 :(得分:0)
嗯,很难理解你所说的“操纵”可能意味着很多。
如果您不想保留原件,则可以按如下方式定义该功能:
void changeString(char* str);
如果你需要保留原文,那么你可能想要将内容复制到临时缓冲区,更改它并像这样返回:
char* returnModified(char* str )
{
char* tmp = malloc(strlen(str));
strcpy(tmp, str);
// do watever
return tmp;
}
使用最新方法确保正确跟踪分配的内存