使用指针

时间:2018-04-25 21:07:11

标签: c string pointers

我需要找到一种方法来使用C中的指针来反转字符串。我不应该使用数组表示法或字符串库函数。

这是我目前的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    //Reverse2
    char *forward = "123";
    char *back = malloc(sizeof(char) * 4);
    reverse2(forward, back);

    return 0;
}

void reverse2(char *string, char *string2) {
    int counter = 0;
    char *string1 = string;
    while (*string1) {
        counter += 1;
        string1 += 1;
    }
    string1--;
    int i;
    for (i = 0; i <= counter; i++) {
        *string2 = *string1;
        string2 += 1;
        string1--;
    }
    printf("%s", string2);
}

这是我在ideone中运行时出现的错误:

Compilation error   #stdin compilation error #stdout 0s 0KB

prog.c:8:2: warning: implicit declaration of function 'reverse2' is invalid in C99 [-Wimplicit-function-declaration]
        reverse2(forward, back);
        ^
prog.c:41:6: error: conflicting types for 'reverse2'
void reverse2(char* string, char* string2){
     ^
prog.c:8:2: note: previous implicit declaration is here
        reverse2(forward, back);
        ^
1 warning and 1 error generated.

3 个答案:

答案 0 :(得分:4)

您的编译错误是由于您在reverse2中调用main,但C编译器不知道 中的 main reverse2 尚未 ,因为 后定义了 <{1}} reverse2。 (C编译器必须能够以流方式编译.c文件,因此这意味着编译某些东西所需的一切 - 如函数 - 必须事先定义)

如果你颠倒了两个函数的顺序(即你将main放在reverse2之前),或者添加这个声明:

main

void reverse2(char*, char*); 之前,那个错误不会发生。

(我没有检查过你的代码,所以我不知道它是否符合你的要求,但你的问题是关于编译错误:不是代码是否实际反转了字符串)

答案 1 :(得分:3)

1 - prog.c:8:2:警告:C99中函数'reverse2'的隐式声明无效[-Wimplicit-function-declaration]         reverse2(前进,后退);

此错误是因为您需要在主要尝试调用之前定义reverse2(),只需在reverse2()的代码之前移动main()的代码。

2 - 您需要在reverse2()

中终止后向字符串
for (i = 0; i <= counter; i++) {
    *string2 = *string1;
    string2 += 1;
    string1--;
}
*string2 = '\0';

3 - 尝试在string2中打印reverse2()并不好,因为它指向字符串的结尾。在back中打印main(),您将看到预期的结果。

reverse2(forward, back);
printf("%s", back);

答案 2 :(得分:1)

要阻止这些有用的警告,您应该在从reverse2调用main()之前声明或定义reverse2函数。

此外,string2未在目标字符串中设置空终止符,并且根本不打印反转字符串,因为指针reverse2已前进到反转字符串的末尾。

除非指定原型,否则应考虑在#include <stdio.h> #include <stdlib.h> char *reverse2(const char *src) { const char *p = src; char *dest, *q; while (*p) { p++; } dest = malloc(p - src + 1); if (dest != NULL) { q = dest; while (p > src) { *q++ = *--p; } *q = '\0'; } return dest; } int main(void) { const char *forward = "123"; char *back = reverse2(forward); printf("%s\n", back); free(back); return 0; } 中为反转字符串分配空间并返回指针:

以下是修改后的版本:

{{1}}