#include <stdio.h>
#define MAX 100
void swap_string1(char *A, char *B);
int main (void) {
char S1[MAX]="ABC"; //tried these with different
char S2[MAX]="defgh"; //strings for S1 and S2
printf("S1: %snS2: %sn",S1,S2);
swap_string1(S1,S2);
printf("S1: %snS2: %sn",S1,S2);
swap_string1(S1,S2);
printf("S1: %snS2: %sn",S1,S2);
return 0;
}
void swap_string1(char *A, char *B) {
char temp, *tempP;
while ( *A != ' ' && *B != ' ' ) {
temp = *A;
*A = *B;
*B = temp;
A++ ; B++ ;
}
//strings unequal lengths, so finish-off the tail end
if ( *A == ' ' && *B !=' ' ) {
tempP=B;
while ( *B ) *A++=*B++;
*A=' ' ; *tempP=' ' ;
}
else if ( *A != ' ' && *B ==' ' ) {
tempP=A;
while ( *A ) *B++=*A++;
*B=' ' ; *tempP=' ' ;
}
}
这是我从笔记中获得的代码,它可以通过指针交换两个字符串,但我并没有真正了解如何检查长度不等的字符串的部分。
谁能向我解释这部分?
它非常简单:
*A 和 *B(指针引用的值(是指 A 和 B 在if ( *A == ' ' && *B !=' ' )
或if ( *A != ' ' && *B ==' ' )
中的字符值,它们一直运行到它们各自的当前字符到达终止字符(也称为行尾或 eof,尤其是为什么要处理文件(。 由于存在"&&"运算符,这意味着循环中的内容会发生,直到具有较小数字的字符串(考虑到它们是不相等的(的字符达到 EOF 或"\0"。
如果字符串相等,那么它们将一起到达它们的终止字符,这是第一个 while 循环。
交换部分:(对于字符串不相等的 if 部分(
首先,按照您的代码,有一个临时指针tempP
在进入 while 循环while(*B)
以保存 B 的指向位置之前初始化为 B 的地址。我们分配它,因为我们需要使用 eof 字符再次收集 B 的值(在临时指针中执行(。(当你做*A++=*B++
时,值会发生变化,因为它是一个引用的算术 - 类似于通过引用调用函数来更改传递参数的值(
现在,由于我们需要交换剩余部分(A 和 B 中字符数相等之后的字符(,我们将字符串 B 的值分配给 while*A++=*B++
循环内的字符串 A('++' 以迭代值,在 A 和 B 中逐个字符遍历。对于指针算术,它将是整数的每个 +4 这样的内存地址,但它是我们在这里引用的值(,您可以注意到循环条件是while(*B)
这与写入while(*B!=' ')
相同,这意味着循环运行到 B 的最后一个字符(就在 eof 字符之前(。交换后,该 eof 字符不会触及或为字符串 A(现在使用字符串 B 值(就位,因此我们分配*A=' '
.类似地,要终止字符串 B,我们需要*B=' '
此处*tempP=' '
。(因为我们为 B 的地址分配了临时指针 tempP,而 B 值更改了*A++=*B++
(
同样,对于其他部分,则相反。
if ( *A == ' ' && *B !=' ' ) { //
如果 B 更长
tempP=B; //
记住副本应该在哪里结束
while ( *B ) *A++=*B++; //
将 B 的其余部分复制到 A
中*A=' ' ; *tempP=' ' ; //
终止 A 和 B
}
else if ( *A != ' ' && *B ==' ' ) { //
A 是否更长
tempP=A; //
记住副本应该在哪里结束
while ( *A ) *B++=*A++; //
将 A 的其余部分复制到 B
中*B=' ' ; *tempP=' ' ; //
终止 B 和 A
}
-
要交换字符串,您可以简单地交换两个指针。
-
要确定两个字符串的相等性,您可以简单地使用
#include <string.h>
之后的内置函数strcmp(str1, str2)
.