此函数如何以相反顺序打印字符串?

时间:2019-08-13 11:55:18

标签: c string pointers recursion

我正在学习c编程中的字符串和字符。今天我看到了一个代码,它以相反的顺序打印字符串,但是我不明白它是如何工作的。您能帮我理解吗?

  void reverse(const char * const sPtr)
    {

    if ('\0' == sPtr[0]) {
         return;
    }

    else { 
          reverse(&sPtr[1]); 
          putchar(sPtr[0]);
          }
    }

2 个答案:

答案 0 :(得分:8)

  

我不知道该函数如何反转字符串

该函数不反转字符串。其参数用限定符import com.exscudo.desktop.cryptoterminal.utils.PropertyLoader; import com.sun.javafx.scene.control.skin.resources.ControlResources; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import static com.exscudo.desktop.cryptoterminal.utils.ReflectionUtils.getUnsafeFieldValue; import static java.util.ResourceBundle.getBundle; public abstract class Messages { private static final String FIELD_NAME = "lookup"; private static final String BUNDLE_NAME = "bundle/strings"; private static final String CONTROLS_BUNDLE_NAME = "com/sun/javafx/scene/control/skin/resources/controls"; private static ResourceBundle BUNDLE; private static void initBundle() { final Locale locale = Locale.getDefault(); final ClassLoader classLoader = ControlResources.class.getClassLoader(); final ResourceBundle controlBundle = getBundle(CONTROLS_BUNDLE_NAME, locale, classLoader, PropertyLoader.getInstance()); final ResourceBundle overrideBundle = getBundle(CONTROLS_BUNDLE_NAME, PropertyLoader.getInstance()); final Map override = getUnsafeFieldValue(overrideBundle, FIELD_NAME); final Map original = getUnsafeFieldValue(controlBundle, FIELD_NAME); //noinspection ConstantConditions,ConstantConditions,unchecked original.putAll(override); BUNDLE = getBundle(BUNDLE_NAME, PropertyLoader.getInstance()); } public static ResourceBundle getResourceBundle() { if (BUNDLE == null) initBundle(); return BUNDLE; } public static void clearBundle() { BUNDLE = null; } } 声明。

const

它以相反的顺序输出一个字符串。

由于这些陈述

void reverse(const char * const sPtr);
             ^^^^^

最后一个输出字符串的第一个字符,最后输出终止零之前的最后一个字符。

例如,该函数可以编写得更简单

  reverse(&sPtr[1]); 
  putchar(sPtr[0]);

我们假设void reverse( const char *s ) { if ( *s ) { reverse( s + 1 ); putchar( *s ); } } 是指向字符串文字s的第一个字符的指针。

然后,由于字符'H'不等于0("Hello"),因此该函数调用自身传递指向第二个字符if ( *s )的指针。

再次'e'不等于0,因此该函数递归调用自身。它将自行进行调用,直到if语句'e'中的表达式被评估为false为止,然后if ( *s )等于*s。因此,该函数的先前调用会输出其相应的字符

'\0'

您可以通过以下方式想象

putchar( *s );

答案 1 :(得分:2)

函数以相反的方式输出字符串。这是一个递归函数,该语句调用该函数本身。

 reverse(&sPtr[1]);

以字符串“ abc”为例:

reverse("abc"); sPtr不为null,因此使用参数reverse(&sPtr[1]);指向“ bc”的情况调用&sPtr[1]。依此类推。

reverse("abc");
reverse("bc");
reverse("c");    
reverse("");  //Now sPtr is null, reverse() returns to `reverse("c") frame:

// just returned from reverse("c") call so do 
// next statement following it 
// in reverse("bc") frame.
putchar(sPtr[0]); //  outputs "c" 

// reverse("c") frame reaches function end 
// so returns back from reverse("bc")
// call and executes next statement 
// after reverse("bc") 
putchar(sPtr[0]); //  outputs "b" 

// reverse("bc") frame reaches function end 
// so returns back from reverse("abc")
// call and executes next statement 
// after reverse("abc") 
putchar(sPtr[0]); //  outputs "a"