grep("(?=.*1)(?=.*0)", iphod$a)
我该如何使用数组值?我在做字符串操作
答案 0 :(得分:3)
每个人都必须学习如何使用数组,字符串,指针和函数 - 以及如何将数组和指针传递给函数并处理函数返回。
当声明变量(包括数组类型)时,变量的生命周期仅存在于声明的范围内,除非动态分配变量的内存或声明为static
或其他< em>静态存储持续时间。
为什么呢?函数堆栈中创建的变量的存储是在函数堆栈上创建的,该函数堆栈在函数 return 上被销毁(释放以供重用)。 (main()
本身就是一个功能)。现在函数总是可以返回自己的类型的值,但它不能在函数中用自动存储声明一个类型的数组,并且返回指向数组的指针。
char str[]="something"; /* violates that rule.... */
您有几个选项,但它们依赖于了解"something"
的存储持续时间以及它的确切含义。让我们来看看你试图做的事情:
/* retuning pointer to string literal */
const char *string1 ()
{
const char *s = "something";
return s;
}
上面有一些细微之处。第一个"something"
是字符串文字,它在程序生命周期内具有静态存储持续时间。因此,您要分配在只读内存中创建的"something"
的地址,该地址将在string1
返回后继续存在。由于函数可以始终返回自己的类型(在这种情况下为const char *
- 为此目的而选择),因此您可以将地址返回到"something"
。
要在s
中使用string2
,您必须将s
作为参数传递给string2
,或将string1
的回复分配给全局指针(不鼓励)。由于s
指向只读内存,因此您应该将传递给string2
的参数声明为const char *
,以表示无法修改它。类似于:
/* simply use string 's' in string2 */
void string2 (const char *s)
{
printf ("in string2(), s : %s\n", s);
}
完全放弃,您可以执行以下操作:
#include <stdio.h>
/* retuning pointer to string literal */
const char *string1 ()
{
const char *s = "something";
return s;
}
/* simply use string 's' in string2 */
void string2 (const char *s)
{
printf ("in string2(), s : %s\n", s);
}
int main (void) {
/* call string 2 passing string1 as the parameter */
string2 (string1 ());
return 0;
}
示例使用/输出
$ ./bin/literalreturn
in string2(), s : something
注意:由于字符串文字静态存储持续时间,您只能在s
中返回string1
。否则,您需要将s
作为参数传递给string1
,或者在s
内为string1
动态分配存储空间,并返回指向新块的起始地址的指针。存储器中。
如果您将字符数组传递给string1
,那么您需要执行类似以下操作:
#include <stdio.h>
#include <string.h>
#define MAXC 32 /* constant for array size */
/* anytime you are passing an array, pass the size. */
char *string1 (char *s, size_t max)
{
if (max < 2) {
fprintf (stderr, "error: insufficient max size.\n");
return NULL;
}
if (strlen (s) < max - 1)
strcpy (s, "something");
return s;
}
/* simply use string 's' */
void string2 (const char *s)
{
printf ("in string2(), s : %s\n", s);
}
int main (void) {
char buf[MAXC] = ""; /* declare character array of MAXC chars */
/* call string 2 passing string1 passing array and size */
string2 (string1 (buf, sizeof buf));
return 0;
}
(由于s
中的string2
未更改,因此它仍然正确传递为const char *s
,这允许对代码进行某些编译器优化。)
仔细看看。你必须理解每个例子的细微之处,因为这些概念都是C的基础。如果你有其他问题,请告诉我。
答案 1 :(得分:1)
你可以在函数定义块中使用静态变量,这有全局存储但是访问范围有限,当需要访问它时,只需通过函数调用来获取指针。以下是代码:
char* string1() {
static char s[64] = "hello"; //this memory has 64 chars
return s;
}
int main(int argc , char *argv[])
{
char* s = string1();
int len = strlen(s);
printf("len: %d\n", len);
for (int i = 0; i < len; ++i) {
printf("char at: %d is %c\n", i, s[i]);
}
}
输出:
len: 5
char at: 0 is h
char at: 1 is e
char at: 2 is l
char at: 3 is l
char at: 4 is o
答案 2 :(得分:0)
你不能。第一个函数的字符串是一个局部变量,从范围中访问它会导致未定义的行为。你可以做的是动态分配字符串并将控制权交给用户。
答案 3 :(得分:0)
如果您的str
是
char str[]="something";
它是一个字符串文字,你可以简单地返回str
作为一个数组,将衰减到数组的基地址,因为它将在只读内存中并将保留在那里直到程序结束。
如果是这种情况,函数的返回类型应为char *
,如
char *string1();
请参阅demo。
如果str
不是,
char str[30];
strcpy(str, "hello");
str
将在堆栈中分配,一旦控制退出声明它的函数,就无法访问它。
为了避免这种情况,您可以在堆内存上分配
char *string1()
{
char *str=malloc(sizeof(char)*30);
strcpy(str, "hello");
return str;
}
一旦你完成使用它,不要忘记释放内存。
char *p=string1();
printf("\n%s", p);
free(p);
请参阅demo。