如何在C中备份字符串

时间:2018-08-30 02:57:21

标签: c string pointers c-strings strcpy

如何备份原始格式的字符串?我正在使用strncpy(),但是,当我尝试打印句子时,原始文本已更改。 这是一个示例:如果我输入gets“ This is a sample text”并要求打印句子,则控制台将打印“ TTTTs是足够的ttxt”。有人可以告诉我如何做到这一点,以便使句子备份变量具有备份并正确显示输入的句子。

    //String variable to contain the user input.
    char sentence[] = "";
    char sentenceBackup[] ="";

    //this variable tracks the size of the user input.
    int sentenceLength;

    //ask the user forsinput
    printf("Enter a free formed sentence that needs to be sorted: \n");

    //accept the user entry into sentence.
    //scanf is deprecated since C11.
    gets(sentence);

    // keep a backup for further operation.
    strncpy(sentenceBackup, sentence, findLength(sentence));


    //display the sentence entered.
    printf("The sentence is : %s\n", sentence);

Ps:如果我取消了strncpy()方法,则会正确显示源文本,即句子变量。

2 个答案:

答案 0 :(得分:2)

  1. sentence的大小不足以容纳输入。

  2. 其次,gets已过时,请不要使用它。从这个online C reference

      

    gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能被安全地使用(除非程序在限制stdin出现的环境中运行)。因此,该功能已在C99标准的第三个勘误表中弃用,并在C11标准中完全删除。建议使用fgets()和gets_s()。 请勿使用gets()。

答案 1 :(得分:0)

如果您可以接受using getlinestrdup,请使用它们!

如果不允许使用它们,则至少应heap-allocate个字符串(带有calloc,但不要忘记结尾 NUL 的额外字节个字节),不要忘了稍后free。当然,您需要显式“备份”(通过适当地复制原始字符串)。

如果不允许堆分配,请确保声明足够大的缓冲区。我建议至少128个字节。

请访问某个C reference网站(研究您使用的每个功能的文档),然后参考C11标准n1570。您会看到gets不再是C的一部分,并且由于危险而被禁止。至少使用fgets(最好使用getline)。

使用所有警告和调试信息来编译代码,例如gcc -Wall -Wextra -gGCC。对其进行改进,使其完全不发出任何警告。使用调试器(gdb或其他工具)读取How To Debug Small Programs

请注意,UTF-8 is used everywhere在2018年。所以strlen不要给出字符数(因为像Ê这样的字符需要在{{ 3}}),只有字节长度。