C:麻花炭*

C:麻花炭*,c,arrays,char,C,Arrays,Char,注意:我不能使用任何LIB或INCLUDE 我有以下代码: void twstng(char * str, int end, int strt) { if(strt != end && strt != end-1) { int hlp = str[strt]; printf("strt %d end %d hlp %d\n", strt, end, hlp); str[strt] = str[en

注意:我不能使用任何LIB或INCLUDE

我有以下代码:

void twstng(char * str, int end, int strt) {
    if(strt != end && strt != end-1) {
            int hlp = str[strt];

            printf("strt %d end %d hlp %d\n", strt, end, hlp);

            str[strt] = str[end-1];

            printf("test\n");

            str[end-1] = hlp;

            printf("test\n");

            twstng(str, strt+1, end-1);
    }
}
在主要功能中:

char * sol = "hello";
twisting(sol, 5, 0);
我想把整根绳子扭断。但控制台显示:

strt 0 end 4 help 104
然后是内存访问错误。但是为什么呢

我的第二个问题是,在原始任务中,给定的字符串是

const char * const str

如何在twstng函数中使用它?

在C中,所有字符串文字都是只读字符数组。它可以存储在不可修改的内存中,这会导致错误,例如当您尝试修改它时。这就是为什么在引用字符串文字时应该始终使用const char*

改用数组:

char sol[] = "hello";
您的char*sol是指向字符串hello的指针。作为字符串文字,它实际上是只读的,因此当您将指针传递给函数时,通过指针修改常量字符串hello的内容时会出现错误

关于问题的第二部分,const char*const,即指向常量char的常量指针,对于指针来说确实是一种更好的类型,因为它会表示指向的对象是常量。但是,您不能将此指针传递给函数,因为函数接受指向非常量字符的指针,并且从给出的信息中不清楚如何允许您解决此问题。一种方法是复制字符串并修改副本


编辑:正如所指出的,您的递归调用通过使用更具逻辑性的start first顺序混淆了start和end参数。

我相信对函数底部的“twstng”的递归调用以错误的顺序传递了新的start和end索引,给定声明中的名称,否则声明中的名称顺序错误。

您混淆了参数。 您的函数声明说,第一个参数是end,第二个参数是strt


你的递归调用把它们搞混了。

这到底应该做什么?反转字符串?上下文中的扭曲意味着什么?如果没有include@pmg,就不能使用printf,这取决于所使用的C标准,它的隐式类型可能是正确的,在这种情况下,从技术上讲,可以在没有标题的情况下使用它,即使不应该这样做。而且我们没有看到足够的代码来知道是否包含头。@Arkku:自从C89以来,在范围内没有原型的情况下调用具有可变参数数的函数是不可能的。我不知道在标准运行之前调用printf是如何工作的。在将const char*分配给char*时是否应该有编译器错误?@vlad_tepesch是,尽管它是一个警告,这不是一个错误,但不幸的是,字符串文字虽然是只读的,但没有const char*.o_o类型。我不知道这一点。我使用-std=c99-Wall-Wextra-Wpedantic-Werror编译,所以是的,const char*to char*给出了一个错误。那么,我如何在一个char中复制它并用void函数修改它呢。因为我不能用while for for for for for for for for for循环。@ C.C. +,当你的代码和这个问题的标签是C时,CPP C++?无论如何,实现strlen的一种有趣的递归方法——不幸的是,它可能不适用于任意长的字符串,但在这里不应该成为问题。现在您只需要将字符串复制到一个新数组中。您可以将其设置为静态,例如,仅使用静态字符buf[512],并且不支持长度超过511个字符+终止符的字符串,或者使用malloccountingstr+1。请注意,twisting不需要返回任何内容,它会修改其参数数组。