如何复制使用 strncpy 后剩余的字符串
How to copy the string that remains after using strncpy
我正在学习 C,想了解如何在使用 strncpy
后复制字符串中剩余的字符。我想将字符串 Hello World
分成两行。
For example:
int main() {
char someString[13] = "Hello World!\n";
char temp[13];
//copy only the first 4 chars into string temp
strncpy(temp, someString, 4);
printf("%s\n", temp); //output: Hell
}
如何将剩余的字符 (o World!\n
) 复制到新的一行中打印出来?
在你的情况下,你可以尝试类似的方法:
char temp2[13];
strncpy(temp2, &someString[4], 9);
顺便说一句,你少了一个分号:
char someString[13] = "Hello World!\n";
你认为你可以做的是推动 n
字符的指针并复制 size - n
字符:
size_t n = 4; // nunmber caractere to copy first
size_t size = 13; // string length
char someString[size] = "Hello World!\n";
char temp[size];
char last[size - n]; // the string that contain the reste
strncpy(temp, someString, n); // your copy
strncpy(last, someString + n, 13 - n); // copy of reste of the string
首先,char someString[13]
,您没有足够的 space 用于字符串 Hello World\n
,因为您有 13 个字符,但至少需要 14 个字符,一个NULL byte
、'[=14=]'
的额外字节。你最好让编译器决定数组的大小,这样就不会容易出现 UB。
要回答你的问题,你可以只使用printf()
来显示字符串的剩余部分,你只需要指定一个指向你想要开始的元素的指针。
此外,strncpy()
不会 NULL
终止 tmp
,如果您想要 printf()
或 [=20] 之类的函数,则必须手动执行此操作=] 才能正常运行。
#include <stdio.h>
#include <string.h>
int main(void)
{
char someString[] = "Hello World!\n";
char temp[14];
strncpy(temp,someString,4);
temp[4] = '[=10=]'; /* NULL terminate the array */
printf("%s\n",temp);
printf("%s",&someString[4]); /* starting at the 4th element*/
return 0;
}
关于 strncpy
你应该了解的一件事是 永远不要使用这个功能。
strncpy
的语义是反直觉的,大多数程序员都很难理解。它令人困惑且容易出错。在大多数情况下,它无法完成工作。
在您的例子中,它复制了前 4 个字节并使 temp
的其余部分未初始化。您可能已经知道这一点,但仍然通过将 temp
作为字符串参数传递给 printf
来调用未定义的行为。
如果您想操纵内存,请使用 memcpy
和 memmove
并注意空终止符。
事实上,字符串"Hello world!\n"
有13个字符和一个空终止符,需要14个字节的内存。定义 char someString[13] = "Hello World!\n";
是合法的,但它使 someString
不是 C 字符串。
#include <stdio.h>
#include <string.h>
int main() {
char someString[14] = "Hello World!\n";
char temp[14];
memcpy(temp, someString, 4); //copy only the first 4 chars into string temp
temp[4] = '[=10=]'; // set the null terminator
printf("%s\n", temp); //output: Hell\n
strcpy(temp + 4, someString + 4); // copy the rest of the string
printf("%s\n", temp); //output: Hello World!\n\n
memcpy(temp, someString, 14); //copy all 14 bytes into array temp
printf("%s\n", temp); //output: Hello World!\n\n
// Note that you can limit the number of characters to output for a `%s` argument:
printf("%.4s\n", temp); //output: Hell\n
return 0;
}
您可以在此处阅读有关 strncpy
的更多信息:
我正在学习 C,想了解如何在使用 strncpy
后复制字符串中剩余的字符。我想将字符串 Hello World
分成两行。
For example:
int main() {
char someString[13] = "Hello World!\n";
char temp[13];
//copy only the first 4 chars into string temp
strncpy(temp, someString, 4);
printf("%s\n", temp); //output: Hell
}
如何将剩余的字符 (o World!\n
) 复制到新的一行中打印出来?
在你的情况下,你可以尝试类似的方法:
char temp2[13];
strncpy(temp2, &someString[4], 9);
顺便说一句,你少了一个分号:
char someString[13] = "Hello World!\n";
你认为你可以做的是推动 n
字符的指针并复制 size - n
字符:
size_t n = 4; // nunmber caractere to copy first
size_t size = 13; // string length
char someString[size] = "Hello World!\n";
char temp[size];
char last[size - n]; // the string that contain the reste
strncpy(temp, someString, n); // your copy
strncpy(last, someString + n, 13 - n); // copy of reste of the string
首先,char someString[13]
,您没有足够的 space 用于字符串 Hello World\n
,因为您有 13 个字符,但至少需要 14 个字符,一个NULL byte
、'[=14=]'
的额外字节。你最好让编译器决定数组的大小,这样就不会容易出现 UB。
要回答你的问题,你可以只使用printf()
来显示字符串的剩余部分,你只需要指定一个指向你想要开始的元素的指针。
此外,strncpy()
不会 NULL
终止 tmp
,如果您想要 printf()
或 [=20] 之类的函数,则必须手动执行此操作=] 才能正常运行。
#include <stdio.h>
#include <string.h>
int main(void)
{
char someString[] = "Hello World!\n";
char temp[14];
strncpy(temp,someString,4);
temp[4] = '[=10=]'; /* NULL terminate the array */
printf("%s\n",temp);
printf("%s",&someString[4]); /* starting at the 4th element*/
return 0;
}
关于 strncpy
你应该了解的一件事是 永远不要使用这个功能。
strncpy
的语义是反直觉的,大多数程序员都很难理解。它令人困惑且容易出错。在大多数情况下,它无法完成工作。
在您的例子中,它复制了前 4 个字节并使 temp
的其余部分未初始化。您可能已经知道这一点,但仍然通过将 temp
作为字符串参数传递给 printf
来调用未定义的行为。
如果您想操纵内存,请使用 memcpy
和 memmove
并注意空终止符。
事实上,字符串"Hello world!\n"
有13个字符和一个空终止符,需要14个字节的内存。定义 char someString[13] = "Hello World!\n";
是合法的,但它使 someString
不是 C 字符串。
#include <stdio.h>
#include <string.h>
int main() {
char someString[14] = "Hello World!\n";
char temp[14];
memcpy(temp, someString, 4); //copy only the first 4 chars into string temp
temp[4] = '[=10=]'; // set the null terminator
printf("%s\n", temp); //output: Hell\n
strcpy(temp + 4, someString + 4); // copy the rest of the string
printf("%s\n", temp); //output: Hello World!\n\n
memcpy(temp, someString, 14); //copy all 14 bytes into array temp
printf("%s\n", temp); //output: Hello World!\n\n
// Note that you can limit the number of characters to output for a `%s` argument:
printf("%.4s\n", temp); //output: Hell\n
return 0;
}
您可以在此处阅读有关 strncpy
的更多信息: