跳过程序做什么?

what does skip procedure do?

本文关键字:什么 程序 过程      更新时间:2023-10-16

我想确定这段代码是什么?

#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;
}

当我在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

查找一定数量的 (n数量)。这是未定义的行为,因为它在字符串的末尾。

对于const部分,字符串字面值是c++中的const。在c中,它们不是,但仍然不能修改,否则你会得到一个未定义的行为(通常是崩溃)(所以即使在c中,通常最好将它们声明为const并快乐地生活)

basic_string::copy结果的原因是,在你的(特定于编译器/实现,但很常见)编译程序中有一个区域,所有的常量字符串被保存在一起。所以如果你走到一个的结尾,你就会走到另一个的开头。所以在你的可执行文件的某个地方有这样的东西:

dedamiwasomethingsomethingelsesomethingelseelsebasic_string::copy

它将第一个形参解释为指向至少包含n个空字符的字符数组的指针,并在第n个这样的空字符之后返回一个指针。从本质上讲,如果您向它传递正确的输入,则没有未定义的行为

由于传递的是一个简单的以null结尾的字符串,因此它具有未定义的行为,因为在其输入中只有一个这样的空字符。它将在字符串结束后访问内存。

关于编译错误,c++中常量字符串的类型是const char*,而不是char*,您应该检查system函数的返回是否有错误。

跳过字符数组中的n个字符。

将第一个形参解释为指向字符数组的指针对象后返回一个指针第n个这样的空字符。本质上,没有未定义的行为,如果你传递正确的输入给它

由于传递的是一个简单的以空结束的字符串,所以它没有定义行为,因为在其输入中只有一个这样的空字符。它将在字符串结束后访问内存。

关于编译错误,c++中常量字符串的类型为const char*,而不是char*,您应该检查系统的返回错误函数。——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;
}

跳过过程请求段错误。

基本上,它增加p,直到找到下一个'',并重复n次。

在最好的情况下,不会打印任何东西,因为'…'是用于std::cout(std::ostream&, const char *)的空字符串。

在最坏的情况下,有鼻龙,引用comp.lang.c.