将C字符串指针解引用到变量中

时间:2018-12-23 18:52:39

标签: c

我有以下简单程序,该程序创建一个指向字符串第一个字符的指针:

char str[] = "Hello world";                                                   
char *p = &str[0];

然后如何仅使用指针将字符串返回到变量中?

解引用指针只是给出了字符串的第一个字符(正如您所期望的那样),因此我假设没有“简单”的方法可以实现此目的,而是需要编写额外的代码。

我目前处理此问题的方式如下:

  1. 从指针进行迭代,直到到达空终止符以找到字符串的长度
  2. 创建一个具有此长度的新char数组
  3. 再次迭代将字符插入此数组

是否有一个库函数来实现这一目标,或者如果没有,则是一种不涉及迭代两次的简单方法?

4 个答案:

答案 0 :(得分:1)

是的,您必须“手动执行”。由于C中没有对象-您需要处理代码中发生的所有事情。

您可以使用mallocstrlenmemcpy

char str[] = "Hello world";                                                   
char *p = malloc(strlen(str) + 1);
if (!p) { abort(); }
memcpy(p, str, strlen(str) + 1);

您可以使用strcpy并忘记一个strlen

char *p = malloc(strlen(str) + 1);
if (!p) { abort(); }
strcpy(p, str);

或者您可以通过POSIX或C扩展名使用strdup

char *p = strdup(str);
if (!p) { abort(); }

答案 1 :(得分:0)

尝试此代码:

#include "stdio.h"
int main(){
char str[] = "Hello world";                                                   
int count = 12; 
char (*p)[12] = &str;
printf("%c\n",(*p)[0]);
printf("%c\n",(*p)[1]);
printf("%c\n",(*p)[2]);
printf("%c\n",(*p)[3]);
printf("%s\n",(*p)); 
}

答案 2 :(得分:0)

...

  

是否有一个库函数来实现这一目标,或者如果没有,则是一种不涉及迭代两次的简单方法?

如评论中所述,strdup()会完全按照您的要求进行。但是这里还有另一个问题(从您的角度来看):strcpy()将对字符串进行两次插入,因为没有其他方法可以复制字符串。

根据定义,C中的字符串是内存中某处的字符序列,最后一个字符为NUL(带有单个L),值为0(以char表示)。对字符串的引用是指向上述序列中第一个字符的指针。请注意,两个不同的字符串可以指向同一个内存(它们并没有那么不同……),或者一个字符串可以指向另一个内存的中间。这两种情况有些特殊,但并不罕见。字符串的内存必须由程序员管理,程序员是唯一知道在何处分配和释放字符串空间的人。像strcpy()这样的函数在这方面没有什么特别的,它们(大概)写得很好并且已优化,因此也许复制一个字符串的行为并不像我之前描述的那样简单,但是思想是相同的。

答案 3 :(得分:0)

这是我仅使用标准库函数复制字符串的方法:

#include <stdio.h>  // printf
#include <stdlib.h> // malloc
#include <string.h> // strcpy

int main(void)
{
    char str[] = "Hello world"; // your original string
    char *p = (char *)malloc(strlen(str) + 1); // allocate enough space to hold the copy in p
    if (!p) { // malloc returns a NULL pointer when it fails
        puts("malloc failed.");
        exit(-1);
    }
    strcpy(p, str); // now we can safely use strcpy to put a duplicate of str into p
    printf("%s\n", p); // print out this duplicate to verify
    return 0;
}