2013-09-29 96 views
1

我很尷尬地問這樣一個問題,但是我用C語言編寫已經有好幾年了,坦白地說,語言要比我想象的要長得多。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()具有相同的參數數量和類型,但這個函數沒有問題?

謝謝, 克里斯

+0

你正在傳遞一個字符到printf,它需要一個char *。你期待printf做什麼?它肯定不會扭轉你的字符串。 – pburka

回答

2

這是因爲line[len-1]不是字符串。 line是一個字符串,所以儘量printf("%s" , line)printf("%c" , line[len-1])代替

2

功能reverse取參數linechar[]型,即陣列的char S,即串,這樣:

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

要麼是(在你想要的情況下打印單個字符):

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

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

printf("%s", line); 

「功能getNextLine具有相同的參數個數和類型,但這個功能有沒有問題?」
〜>編譯器給你的錯誤與printf有關,在其他函數中沒有使用它。

「已經有好幾年,因爲我在C語言編寫的」
〜>邊注:您的代碼提醒老ANSI C.這是自上一次,這是一個必須申報所有的變量很長一段時間函數的開始。

+0

我正在大學上課,所以我們被告知要做的事當然是在曲線後面的年份。感謝您的建議,讓我改變我的代碼。 –

1

一個字符在C. line [len-1]中有一個int類型,然後轉換爲int,這就是編譯器所抱怨的。看到%s限定符printf函數需要一個指向字符串開頭的指針。隨後將打印從指針地址開始的字符,直到它遇到\ 0。 如果要打印一個字符,請使用%c並提供一個int(aka char)。