1

问这样一个问题我很尴尬,但自从我用 C 编码以来已经有好几年了,坦率地说,这门语言回到我身边的时间比我预期的要长得多。

我在我的代码中收到以下警告“格式 %s 需要 char * 类型的参数,但参数 2 的类型为 int”,如下所示。

#include <stdio.h>
#define MAXLINE 1000

int getNextLine(char line[], int maxline);
void reverse(char line[], int len);

main()
{
    int len;
    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while ((len = getNextLine(line, MAXLINE)) > 0)
    {
        reverse(line, len);
    }

    return 0;
}

void reverse(char line[], int len)
{
    if (len == 0)
        return;
    else
    {
        printf("%s",line[len-1]);
        line[len-1] = '\0';
        //reverse(s,len-1);
    }

    return;
}

int getNextLine(char s[], int lim)
{
    int c, i;

    for (i=0; i < lim-1 && (c=getchar()) != EOF && c!='\n'; i++)
        s[i] = c;
    if (c == '\n')
    {
        s[i] = c;
        ++i;    
    }
    s[i] = '\0';
    return i;
} 

我不明白的是,它似乎与参数有关吗?当我剥离 reverse() 使其接受 0 个参数并仅打印出一行乱码时,程序编译时不会发出警告。因此,我怀疑参数是我的问题。更令人困惑的是,函数 getNextLine() 具有相同的参数计数和类型,但这个函数没有问题?

谢谢,克里斯

4

3 回答 3

2

这是因为line[len-1]不是字符串。line是一个字符串,所以尝试printf("%s" , line)printf("%c" , line[len-1])改为

于 2013-09-29T21:55:13.887 回答
2

函数reverse接受linetype的参数char[],即 s 的数组char,即字符串,所以:

printf("%s", line[len-1]);

应该是(如果您想打印单个字符):

printf("%c", line[len-1]);

或(如果您想打印以空字符结尾的字符串):

printf("%s", line);

“该函数getNextLine具有相同的参数计数和类型,但该函数没有问题?”
~> 你的编译器给你的错误是相关的printf,它没有在其他函数中使用。

“自从我用 C 编码以来已经有好几年了”
~> 旁注:你的代码让人想起旧的 ANSI C。自从上次必须在函数开头声明所有变量以来已经很长时间了。

于 2013-09-29T21:57:27.867 回答
1

一个字符在 C 中具有 int 类型。 line[len-1] 然后转换为 int,这就是编译器所抱怨的。看到 %s 限定符 printf 函数需要一个指向字符串开头的指针。然后它将从指定的地址开始打印字符,直到遇到 \0。如果要打印一个字符,请使用 %c 并提供一个 int(又名 char)。

于 2013-09-29T22:02:09.250 回答