如何复制使用 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 来调用未定义的行为。

如果您想操纵内存,请使用 memcpymemmove 并注意空终止符。

事实上,字符串"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 的更多信息: