我有以下简单程序,该程序创建一个指向字符串第一个字符的指针:
char str[] = "Hello world";
char *p = &str[0];
然后如何仅使用指针将字符串返回到变量中?
解引用指针只是给出了字符串的第一个字符(正如您所期望的那样),因此我假设没有“简单”的方法可以实现此目的,而是需要编写额外的代码。
我目前处理此问题的方式如下:
是否有一个库函数来实现这一目标,或者如果没有,则是一种不涉及迭代两次的简单方法?
答案 0 :(得分:1)
是的,您必须“手动执行”。由于C中没有对象-您需要处理代码中发生的所有事情。
您可以使用malloc
,strlen
和memcpy
:
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;
}