C语言是否可以用来做类似的事情:
/* it's a demo code. I know that it doesn't work. */
char foo[] = "abc";
char* p = &foo[0];
int len = 3;
while(len) {
printf("%c", *p);
p--;
len--;
}
并获得cba
输出?
我的问题是:有什么简单的方法可以做到这一点吗?也许使用算术指针。我知道我可以写一个类似函数的东西:
/* Note: I haven't tested the this code. But I believe that works. */
char *strrev(char input[]) {
if (input == NULL) return NULL;
int len = strlen(input) - 1;
char * rev = malloc(len+1);
if (rev == NULL) return NULL;
for (; len != 0; len--) *rev++ = input[len];
if (len == 0) {
*rev++= '\0';
return rev;
} else {
free(rev);
return NULL;
}
}
但我正在寻找更简单的方法,我需要编写一个从半字符串开始比较的函数。
答案 0 :(得分:1)
void backwards_print(const char *text) {
/* don't even try to print an empty string */
if (*text) {
const char *p = text;
/* go to the end */
while (*p++) /* void */;
/* print from the end */
while (p != text) putchar(*--p);
}
putchar('\n'); /* newline, flush buffer */
}
使用示例
char foo[] = "abc";
backwards_print(foo);
答案 1 :(得分:0)
start p at foo[2] and loop while(p >= &foo[0])
答案 2 :(得分:0)
首先,在while
循环开始p
指向第一个字符,即a。那你以前去过角色 - 哪个不存在!
另外 - 杰克 - 为什么要把代码放到你没试过的地方?
答案 3 :(得分:0)
如果您想要轮换,
int index = 1;
static const int kArraySize = sizeof(foo) / sizeof(char);
while(len) {
printf("%c", p[index++ % kArraySize]);
len--;
}
这将打印bca
。如果你想要逆转,那么它会有所不同。
仅供参考,如果是我的代码,我会将这些循环编码有点不同,但我想尽可能多地重复使用您的代码。
答案 4 :(得分:0)
你是不是想从两端到中间工作,像这样?
len = strlen(input) - 1;
for (i = 0; i <= len/2; ++i) {
char c = input[i];
input[i] = input[len - i];
input[len - i] = c;
}
答案 5 :(得分:0)
根据我的阅读,你需要一个这样的功能:
// returns a pointer to the start of 'dst'
// assumes dst has a length = strlen(str) + 1 or more
// also assumes that dst and src are not NULL.
char *strmidrev(char *dst, const char *src)
{
int length = strlen(src);
int mid = length / 2;
for (int i = 0; i < length; i++) {
dst[i] = src[((i + mid) % length)];
}
// NUL terminate the string
dst[length] = '\0';
return dst;
}