[英]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.c
和reverse.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.