我有一个字符串:
char * someString;
如果我想要这个字符串的前五个字母并将其设置为"otherString",我该如何做?我有一个字符串:
char * someString;
如果我想要这个字符串的前五个字母并将其设置为"otherString",我该如何做?#include <string.h>
...
char otherString[6]; // note 6, not 5, there's one there for the null terminator
...
strncpy(otherString, someString, 5);
otherString[5] = '\0'; // place the null terminator
otherString[5] = (char)0;
。Char是整型类型,因此编译器不应该会对将原始整数赋值给它进行抱怨(或不应该)。 - pibotherString[5] = '\0';
和otherString[5] = 0;
都将一个值为0的int
赋给了一个char
。那么(char)
在otherString[5] = (char)0;
中有什么作用呢? - chux - Reinstate Monicastrncpy
是一个危险的函数,永远不应该使用,因为太多人无法理解它的工作原理。在这种情况下,strncpy
可能会或可能不会自行终止字符串,这取决于长度。它是反复无常、不可靠的,并且最初并不打算与以空字符结尾的字符串一起使用。请参见 Is strcpy dangerous and what should be used instead?。 - Lundinchar* someString = "abcdedgh";
char* otherString = 0;
otherString = (char*)malloc(5+1);
memcpy(otherString,someString,5);
otherString[5] = 0;
更新:
提示:理解定义的好方法是使用右左法则(一些链接在末尾):
从标识符开始阅读,大声说出 => "someString
是..."
现在去到 someString 右边(语句以分号结束,无需说什么)。
现在去到标识符左边(遇到了 *
)=> 所以说 "...指向...".
现在去到 "*
" 的左边(找到了关键字 char
)=> 说 "..char".
完成!
因此,char* someString;
=> "someString 是 char 类型的指针"。
由于指针只是指向某个内存地址,它也可以用作字符“数组”的“起点”。
这适用于任何东西..试一试:
char* s[2]; //=> s is an array of two pointers to char
char** someThing; //=> someThing is a pointer to a pointer to char.
//Note: We look in the brackets first, and then move outward
char (* s)[2]; //=> s is a pointer to an array of two char
以下是一些链接: 如何解读复杂的C/C++声明和 如何阅读C语言声明
char *[] someThing;
和char []* someThing;
。你需要分别使用char *someThing[];
和char (*someThing)[];
。这会破坏你理解定义的算法。 - Alok Singhalsomestring
的字符数少于4个,memcpy(someString, otherString, 5)
可能会产生未定义的行为。它在你的例子中可以工作是因为源字符串更长,但对于小的源字符串,行为并没有完全定义。 - chqrlie通用:
char* subString (const char* input, int offset, int len, char* dest)
{
int input_len = strlen (input);
if (offset + len > input_len)
{
return NULL;
}
strncpy (dest, input + offset, len);
return dest;
}
char dest[80];
const char* source = "hello world";
if (subString (source, 0, 5, dest))
{
printf ("%s\n", dest);
}
您可以使用snprintf函数来精确地获取char数组的子串:
#include <stdio.h>
int main()
{
const char source[] = "This is a string array";
char dest[17];
// get first 16 characters using precision
snprintf(dest, sizeof(dest), "%.16s", source);
// print substring
puts(dest);
} // end main
输出:
这是一个字符串
注意:
更多信息请参见printf手册页面。
你需要为新字符串 otherString 分配内存。通常情况下,对于长度为 n 的子字符串,以下代码可能适用于你(不要忘记进行边界检查...)
char *subString(char *someString, int n)
{
char *new = malloc(sizeof(char)*(n+1));
strncpy(new, someString, n);
new[n] = '\0';
return new;
}
这将返回someString的前n个字符的子字符串。使用free()释放内存时,请确保您完成了它。
char *new=new char[n+1]
:-) - dolphinsizeof(char)*n+1
的概念是错误的。可以使用 sizeof(char)*(n+1)
或者简单地使用 n+1
,因为 sizeof(char)==1
。 - chux - Reinstate Monicamemcpy
的是正确的。基本上问题的答案是:memcpy
是正确的。总的来说,这个问题的答案就是:someString = allocated_memory; // statically or dynamically
memcpy(someString, otherString, 5);
someString[5] = '\0';
memcpy
比 strncpy
更快、更安全,而且不会让人困惑是否要在字符串中加入空终止符 - 它不需要加入,所以我们必须手动添加空终止符。
strncpy
是一个非常危险的函数,不应该用于任何目的。该函数从未旨在用于空结尾字符串,它出现在 C 标准中是一个错误。请参见Is strcpy dangerous and what should be used instead?,我将为方便引用该帖子的一些相关部分:strncpy
无法终止复制字符串的情况。memcpy
也不完美:如果somestring
少于4个字符,则memcpy(someString,otherString,5);
可能会有未定义的行为。 对于这个问题有一个简单的一行代码解决方案:sprintf(someString, "%.5s", otherString)
,但感觉就像用谢尔曼坦克去买菜。 - chqrliechar str[10];
str可以用作指针。因此,如果您只想复制字符串的一部分,可以使用以下方法:
char str1[24] = "This is a simple string.";
char str2[6];
strncpy(str1 + 10, str2,6);
我认为这是一种简单的方法...但我不知道如何直接传递结果变量,所以我创建了一个本地字符数组作为临时变量并返回它。
char* substr(char *buff, uint8_t start,uint8_t len, char* substr)
{
strncpy(substr, buff+start, len);
substr[len] = 0;
return substr;
}
start
and len
should have type size_t
, not uint8_t
- chqrliestrncpy(otherString, someString, 5);
别忘了为 otherString 分配内存。
#include <stdio.h>
#include <string.h>
int main ()
{
char someString[]="abcdedgh";
char otherString[]="00000";
memcpy (otherString, someString, 5);
printf ("someString: %s\notherString: %s\n", someString, otherString);
return 0;
}