簡體   English   中英

為什么在這里出現“格式'%s'期望類型為'char *'但...”的錯誤?

[英]Why am I getting the “format '%s' expects argument of type 'char *' but…” error here?

我對C還是很陌生,但仍然掌握了基礎知識。 我正在寫一個非常簡單的練習,用一個短語並將其反轉。 我確定此代碼還有其他問題,但主要是在編譯main.c時,我一直在收到錯誤消息

main.c:14:9:警告:格式'%s'期望使用char *類型的參數,但是參數2卻沒有找到'int'類型的命令

我不知道為什么會收到該錯誤,有人可以幫助我理解為什么嗎? 謝謝!

我的main.c

int main (int argc, char * argv [])
{

char word[] = "Happy Birthday!";

printf("%s\n", word);
reverse(word);
printf("%s\n", word);
printf("%s\n", reverse(word));
printf("%s\n", word);

system ("Pause");
return 0;
}

我的反向

#include<stdio.h>
#include<string.h>

char *reverse(char *word)
{
char *rev;
char *i;
char temp;

rev = word;
for (i = word; *i != '\0'; i++)
{
        if (i - word > 1)
                for (i--; word < i; word++, i--)
                {
                        temp = *word;
                        *word = *i;
                        *i = temp;
                }

return rev;
}

如果那是您整個main.c源文件,則編譯器看不到reverse函數的聲明。

在C89 / C90中,對未聲明函數的調用將創建該函數的隱式聲明,並返回int類型的結果。 如果函數實際上像int一樣返回int以外的值,則行為是不確定的。

C99刪除了此“隱式int ”規則,使對未聲明函數的任何調用都違反約束 ,需要進行診斷。 您應該了解如何誘使編譯器診斷這種調用。

解決的辦法是在main.c顯示reverse聲明。 最好的方法是創建一個頭文件,最有可能是reverse.h ,其中包含聲明:

#ifndef REVERSE_H
#define REVERSE_H

char *reverse(char *word);

#endif

#include main.creverse.c中的標頭。 (在main.c包含它提供了聲明,以便可以正確地編譯該調用。在reverse.c包含它可以使編譯器確定聲明和定義是一致的。)

由於您沒有在main.c文件(模塊)中包括您的reverse()函數的聲明,因此編譯器(帶有適當的警告警告標記)假定它返回int

所以包括聲明

char *reverse(char *word);

main.c文件的開頭。

問題是反向函數的類型。 這是替代代碼:

#include<stdio.h>
#include<string.h>

void reverse(char *word)
{
    size_t i;
    size_t length = strlen(word);
    size_t tmp;
    for (i = 0; i < (length / 2); i++) {
        tmp = length-i-1;
        /* This is a xor swap. */
        word[i] ^= word[tmp];
        word[tmp] ^= word[i];
        word[i] ^= word[tmp];
    }
}

int main (int argc, char * argv [])
{
    char word[] = "Happy Birthday!";
    printf("%s\n", word);
    reverse(word);
    printf("%s\n", word);
    reverse(word);
    printf("%s\n", word);
    printf("%s\n", word);
    system ("Pause");
    return 0;
}

這是證明: 運行代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM