我正在学习c编程中的字符串和字符。今天我看到了一个代码,它以相反的顺序打印字符串,但是我不明白它是如何工作的。您能帮我理解吗?
void reverse(const char * const sPtr)
{
if ('\0' == sPtr[0]) {
return;
}
else {
reverse(&sPtr[1]);
putchar(sPtr[0]);
}
}
答案 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"