![](/img/trans.png)
[英]How to reverse an array of strings and reverse each string in place using pointers?
[英]How to reverse a string with pointers only?
我試圖反轉一個字符串,但它只是保持不變。 除了<string.h>
和<stdio.h>
之外,我不使用任何模塊。
void rev(s){
char i, temp;
char *sf = s;
char ri = strlen((s) - 1);
char *sl = &s[ri];
for (i = 0; i < ri; i++){
if (*sf != *sl){
temp = *sf++;
s[i] = *sl--; //
s[ri--] = temp; //those two seems to be getting new characters, but it won't
}
else {
ri--;
sf++;
sl--;
}
}
printf("%s", s);
}
該函數將不會編譯,至少因為參數沒有類型說明符。
void rev(s){
char
類型的可接受值范圍很小。 所以你不應該用它來計算字符串的長度。
本聲明中對strlen
的調用
char ri = strlen((s) - 1);
調用未定義的行為。 看來你的意思
char ri = strlen(s) - 1;
這也可以為空字符串調用未定義的行為。
這個循環
for (i = 0; i < ri; i++){
不使用指針。
該函數可以通過以下方式定義,如下面的演示程序所示。
#include <stdio.h>
#include <string.h>
char * reverse( char *s )
{
if ( *s )
{
for ( char *first = s, *last = s + strlen( s ); first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return s;
}
int main( void )
{
char s1[] = "1";
char s2[] = "12";
char s3[] = "123";
puts( reverse( s1 ) );
puts( reverse( s2 ) );
puts( reverse( s3 ) );
}
程序輸出是
1
21
321
你的代碼有很多問題(錯誤🐛):
char ri = strlen((s) - 1);
必須是size_t ri = strlen((s)) - 1;
其他代碼很難分析,因為您使用的不是自解釋變量名。
在這里你有更簡單的代碼,更容易分析。
char *reverseString(char *str)
{
char *wrk = str, *end;
if(str && *str)
{
end = str + strlen(str) - 1;
while(end > wrk)
{
char temp = *wrk;
*wrk++ = *end;
*end-- = temp;
}
}
return str;
}
int main(void)
{
char str[] = "1234567890";
printf("reversed: %s\n", reverseString(str));
}
一個簡單的解決方案:
char *sl = sf;
while (*sl != 0)
++ sl;
-- sl;
while (sf < sl)
{
char c = *sf;
*sf = *sl;
*sl = c;
++sf, --sl;
}
通過跳過所有字符直到找到 NUL(零)字符來查找字符串的結尾。
然后后退一個字符(遞減sl
),以便您擁有指向字符串的第一個和最后一個字符的指針。
然后將兩個指針朝向彼此並交換字符,直到指針相交或交叉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.