如何备份原始格式的字符串?我正在使用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()方法,则会正确显示源文本,即句子变量。
答案 0 :(得分:2)
sentence
的大小不足以容纳输入。
其次,gets
已过时,请不要使用它。从这个online C reference:
gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能被安全地使用(除非程序在限制stdin出现的环境中运行)。因此,该功能已在C99标准的第三个勘误表中弃用,并在C11标准中完全删除。建议使用fgets()和gets_s()。 请勿使用gets()。
答案 1 :(得分:0)
如果您可以接受using getline
或strdup
,请使用它们!
如果不允许使用它们,则至少应heap-allocate个字符串(带有calloc
,但不要忘记结尾 NUL 的额外字节个字节),不要忘了稍后free
。当然,您需要显式“备份”(通过适当地复制原始字符串)。
如果不允许堆分配,请确保声明足够大的缓冲区。我建议至少128个字节。
请访问某个C reference网站(研究您使用的每个功能的文档),然后参考C11标准n1570。您会看到gets
不再是C的一部分,并且由于危险而被禁止。至少使用fgets
(最好使用getline
)。
使用所有警告和调试信息来编译代码,例如gcc -Wall -Wextra -g
与GCC。对其进行改进,使其完全不发出任何警告。使用调试器(gdb
或其他工具)读取How To Debug Small Programs。
请注意,UTF-8 is used everywhere在2018年。所以strlen
不要给出字符数(因为像Ê
或∀
这样的字符需要在{{ 3}}),只有字节长度。