我正在尝试确定此代码是什么?
#include <cstdlib>
#include <iostream>
#include<string.h>
using namespace std;
char *skip(char *p,int n)
{
for (;n>0;p++)
if (*p==0) n--;
return p;
}
int main(int argc, char *argv[])
{
char *p="dedamiwa";
int n=4;
cout<<skip(p,n)<<endl;
}
当我运行om dev c ++时,它出错了
`basic_string::copy`
当我在ideone.com上运行它时,它会出错
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:15: warning: deprecated conversion from string constant to ‘char*’
prog.cpp:18: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result
答案 0 :(得分:3)
它会搜索一定数量的\0
(n
个\0
个)。它是未定义的行为,因为它位于字符串结尾之后。
对于const
部分,c ++中的字符串文字为const
。在c中它们不是,但它们仍然不能被修改,否则你会得到一个未定义的行为(通常是崩溃)(所以即使在c中通常最好将它们声明为const
并且活得开心)
basic_string::copy
的结果的原因是在你的(编译器/实现特定的,但很常见的)编译程序中,有一个区域,所有常量字符串都保存在一起”。因此,如果你追求一个结束,你就会走到另一个的开始。因此,您的可执行文件中的某个位置有:
dedamiwa\0something\0somethingelse\0somethingelseelse\0basic_string::copy
答案 1 :(得分:2)
它将第一个参数解释为指向包含至少n
个空字符的字符数组的指针,并在第n个此类空字符后面返回一个指针。本身,如果您向其传递正确的输入,则没有未定义的行为。
由于传递一个简单的以null结尾的字符串,因此它具有未定义的行为,因为在其输入中只有一个这样的空字符。它将在字符串结束后访问内存。
关于编译错误,在C ++中,常量字符串的类型为const char*
,而不是char*
,您应该检查system
函数的返回错误。
答案 2 :(得分:1)
它会跳过char数组的n个字符。
它将第一个参数解释为指向字符数组的指针 包含至少n个空字符,并返回一个指针 第n个这样的空字符。本身,如果没有未定义的行为 你传递了正确的输入。
由于传递一个简单的以null结尾的字符串,因此它未定义 行为,因为其输入中只有一个这样的空字符。它 将在字符串结束后访问内存。
关于编译错误,在C ++中,常量字符串是类型
const char*
,而不是char*
,您应该检查系统的返回 错误的功能。 by - Sylvain Defresne
带有显式括号的代码版本可能有点 更具可读性:
using namespace std;
char *skip(char *p,int n){
for (;n>0;p++)
if (*p==0) {
n--;
}
return p;
}
摆脱错误:
int main(int argc, char *argv[])
{
// cast the string which is of the type const char* to the
// type of the defined variable(char*) will remove your warning.
char *p= (char*) "dedamiwa";
int n=4;
cout<<skip(p,n)<<endl;
}
答案 3 :(得分:0)
跳过程序要求发生段错误。
基本上,它递增p直到下一个&#39; \ 0&#39;找到了,并重复了n次。
在最好的情况下,不会打印任何内容,因为&#39; \ 0 ...&#39;是std :: cout的空字符串(std :: ostream&amp;,const char *)。
在最坏的情况下,有鼻龙,引用comp.lang.c。