我在MS写的访谈中被问到这个问题:
在下面的程序中查找错误,该错误应该返回一个\n附加到其上的新字符串.
char* AddnewlinetoString(char *s)
{
char buffer[1024];
strcpy(buffer,s);
buffer[strlen(s)-1] = '\n';
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
我试图对自己进行编码,并且能够通过使缓冲区变量全局和具有来实现它buffer[strlen(s)] = '\n'.但不知道还有很多其他的错误.
cod*_*ict 55
我可以看到一些:
未检查输入字符串的长度.
怎么样strlen(s) > 1023?您最多可以1023在缓冲区中输入一串长度.
覆盖最后一个字符
\n
你用换行符覆盖了最后一个字符.你\n应该去的地方\0曾经是,你需要添加一个新的\0后\n
变量缓冲区是函数本地的,您将返回其地址.
缓冲区的内存在堆栈上分配,一旦函数返回,该内存就被释放.
我会做:
char* AddnewlinetoString(char *s) {
size_t buffLen = strlen(s) + 2; // +1 for '\n' +1 for '\0'
char *buffer = malloc(buffLen);
if(!buffer) {
fprintf(stderr,"Error allocting\n");
exit(1);
}
strcpy(buffer,s);
buffer[buffLen-2] = '\n';
buffer[buffLen-1] = 0;
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
这是一个没有错误的C++版本:
std::string AddnewlinetoString(std::string const& s)
{
return s + "\n";
}
Run Code Online (Sandbox Code Playgroud)
以下是我可能会在C++ 0x中编写的内容:
std::string AddnewlinetoString(std::string s)
{
return std::move(s += "\n");
}
Run Code Online (Sandbox Code Playgroud)
我还要补充说,方法的名称应该坚持模式,每个单词应该以大写字母开头:
char* AddNewlineToString(char *s)
{
}
Run Code Online (Sandbox Code Playgroud)
PS.感谢Konrad,我已根据您的建议更改了方法名称