ich eine einfache Lösung für die Brian Kernighan geschrieben haben ‚s "Die Programmiersprache C" Übung 1-19, dass die eine umkehrt Zeichenkette. Die reverse(char[])
Funktion ist wie unten und alles ist in Ordnung;Postfix ++ Operator Nicht Behaving wie erwartet Innerhalb While Bedingung
void reverse(char src[])
{
int len = 0;
while(src[len] != '\0')
len++;
for(int i = 0; i < len/2; i++)
{
char temp = src[i];
src[i] = src[len - 1 - i];
src[len - 1 - i] = temp;
}
}
Wenn ich jedoch die Postfix Inkrement verwenden (++) -Operator innerhalb der while-Schleife, scheitert die Funktion;
void reverse(char src[])
{
int len = 0;
while(src[len++] != '\0') // this fails
;
for(int i = 0; i < len/2; i++)
{
char temp = src[i];
src[i] = src[len - 1 - i];
src[len - 1 - i] = temp;
}
}
Der einzige Unterschied ist, anstatt die variable len innerhalb der while-Schleife Inkrementieren I eine Postfix ++ Operator verwendet, daß die das Verhalten als Erwartung sein sollte, „Verwenden Sie den alten Wert für die bedingte Scheck, nach dem Abschluss inkrementieren Sie es ".
Warum funktioniert es nicht wie erwartet, wo mache ich falsch? Ich kompiliere es unter Windows 10 Mingw/gcc Compiler. Hier ist der gesamte Testcode;
Testcode
#include <stdio.h>
#define STR_NUM 5
#define STR_SIZE 20
void reverse(char[]); // declaration
int main()
{
char str[STR_NUM][STR_SIZE] =
{
{ "A" },
{ "AB" },
{ "ABC" },
{ "ABCD" },
{ "ABCDE" }
};
for(int i = 0; i < STR_NUM; i++)
reverse(str[i]);
for(int i = 0; i < STR_NUM; i++)
printf("%s\n", str[i]);
return 0;
}
// this is working
void reverse(char src[])
{
int len = 0;
while(src[len] != '\0')
len++;
for(int i = 0; i < len/2; i++)
{
char temp = src[i];
src[i] = src[len - 1 - i];
src[len - 1 - i] = temp;
}
}
// this is failing
/*
void reverse(char src[])
{
int len = 0;
while(src[len++] != '\0') // this fails
;
for(int i = 0; i < len/2; i++)
{
char temp = src[i];
src[i] = src[len - 1 - i];
src[len - 1 - i] = temp;
}
}
*/
Verwenden Sie einen Debugger, um zu sehen, was 'len' als endet. Es spielt immer noch nach den Regeln, aber es wird erhöht * obwohl * Sie sind am Ende, wenn Ihre Zeichenfolge. – usr2564301
Rad Lexus hat Recht. Für einen leeren String führt der Code 'while (src [len ++]! = '\ 0');' das ist nicht wahr, weil 'src [0] == '\ 0''. Danach wird 'len' wegen' len ++ '1 sein. Ihre Zeichenfolge mit einer Länge von 0 wird als eine Länge von 1 betrachtet. –
Beginnen Sie mit 'len == -1' und verwenden Sie' while (src [++ len]) '. – EOF