0

这是我的代码:

#include<stdio.h>
#define MAXLINE 100

/*print the reverse of the input*/

int getline1(char line[], int maxline);
char *reverse(char);

main(){
    int len;
    char line[MAXLINE];
    char *rp;
    while ((len = getline1(line, MAXLINE)) > 0)
            rp = reverse(line);
            printf("%s", *rp);
    return 0;
}
int getline1(char s[], int lim){
    int c, i;

    for (i = 0; (c=getchar()) != EOF && c != '\n'; i++)
            if (i > lim-1)
                    continue;
            else
                    s[i] = c;
    if (c == '\n'){
            s[i] = c;
            i++;
    }
    s[i] = '\0';
    return i;
}
char *reverse(char ca[]){
    int i;
    int i1 = 0;
    char *rp;
    char reversed[MAXLINE];
    for (i = MAXLINE-1; i >= 0; i--){
            reversed[i1] = ca[i];
            i1++;
    }
    rp = reversed;
    return rp;
}

但是当我尝试编译它时,我收到以下错误:

reverse.cpp: In function ‘int main()’:
reverse.cpp:14:20: error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive]
reverse.cpp:7:7: error:   initializing argument 1 of ‘char* reverse(char)’ [-fpermissive]
reverse.cpp:15:19: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘int’ [-Wformat]

我对 C++ 没有太多经验。我究竟做错了什么?我只想创建一个指向 char 数组的指针并返回它。

4

3 回答 3

3

我只想创建一个指向 char 数组的指针并返回它。

您似乎想要返回一个字符串。那不是指向 char 数组的指针。即使您的程序已编译,您也会调用 UB,因为您返回一个指向自动对象的指针 - 并且您的代码中还有很多其他运行时错误。你很幸运,你也犯了一个编译时错误,所以编译器不接受你的程序。这个 C++ 程序实现了你想要的:

#include <string>
#include <iostream>

std::string reverse(std::string val) {
    return std::string(val.rbegin(), val.rend());
}
int main() {
    std::string str;
    while(std::getline(std::cout, str))
        std::cout << reverse(str);
}

我究竟做错了什么?

您正在学习 C89 而不是 C++11。它们真的是不同的东西。

如果您想学习编写 C++ 代码,则必须学习std::string和标准库的其余部分。char*使用、char[]和,您将一事无成MAGIC_BUFFER_SIZE

于 2012-09-01T05:37:17.483 回答
2

你首先声明函数原型

char *reverse(char);

但实际函数声明为

char *reverse(char ca[])

那是你的问题。

于 2012-09-01T05:34:37.857 回答
0

你想达到什么目的?代码中有逻辑错误...

    while ((len = getline1(line, MAXLINE)) > 0)
        rp = reverse(line);
        printf("%s", *rp);

这部分将在每个 /n 字符上调用 reverse ,但永远不会调用 printf ...您还有 100 个字符的字符串,并且您的反向会将前导字符放在反向字符串的末尾。所以如果您有 5 个字符的字符串,您将在前 95 个位置有垃圾,然后是你需要的 5 个字符......

于 2012-09-01T05:48:18.393 回答