2014-11-22 266 views
-3

我的程序应该给我一个字的长度,最高和最低字符。 当我编译程序出现错误:错误:format'%s'需要类型'char *'的参数?

error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[64]’ [-Werror=format=] 
     scanf("%62s", & cString); 

这将是非常好的,如果有人可以给我这个!

#include <stdio.h> 

int stringstats(char sString[], char *cGroesster, char *cKleinster) 
{ 
    //Variablen deklarieren 

    int iLength = 0; 
    int i = 0; 
    *cKleinster = sString[0]; 
    *cGroesster = sString[0]; 

    while (sString[iLength] != '\0') 
    { 
     iLength++; 
    } 

    for (i = 0; i <= iLength - 1; i++) 
    { 
     if (sString[i] < *cKleinster) 
     { 
      *cKleinster = sString[i]; 
     } 

     if (sString[i] > *cGroesster) 
     { 
      *cGroesster = sString[i]; 
     } 
    } 
    return iLength; 
} 

//Funktion deklarieren 

int stringstats(char[], char *, char *); 

#define LENGTH 64 
int main(void) 
{ 
    //Variablendeklaration 

    char cString[LENGTH] = {0}; 
    int iLength = 0; 
    char cGroesster = 0; 
    char cKleinster = 0; 

    while (1) 
    { 
     //Benutzereingabe String 
     printf("Bitte einen String eingeben ('q' fuer Beenden) \n"); 
     scanf("%62s", & cString); 

     //that`s where my problem is 

     //Abbruchbedingung pruefen 
     if (cString[0] == 'q' && cString[1] == '\0') 
     { 
      break; 
     } 

     //Funktion stringstats aufrufen 
     iLength = stringstats(cString, &cGroesster, &cKleinster); 

     printf("Laenge: %i \n", iLength); 
     printf("Kleinster Buchstabe: %c \n", cKleinster); 
     printf("Groesster Buchstabe: %c \n\n", cGroesster); 
    } 

    return 0; 
} 
+2

顺便说一句:在定义之后添加前向声明绝对没有用处。只是把它留下。 – Deduplicator 2014-11-22 22:20:17

+0

@Deduplicator它们可能已经在单独的源文件中声明,并且他正确地包含了另一个函数,因为他认为这可能与他的问题有关。 – SevenBits 2014-11-22 22:30:41

+0

@SevenBits:很有可能。它要么不能很好地修剪这个例子,这很容易发生,或者实际上缺乏理解。虽然我不能说哪个。你可以吗? – Deduplicator 2014-11-22 22:41:08

回答

2

这种情况不起作用的原因是大多数初学程序员都不知道的C的特性。关于scanf想要的内容:它想要一个指向char的指针。虽然在使用(&)操作符的引用来获取指针时是正确的,但这对于此用途实际上是不正确的,因为在C中,数组(包括字符串)是由指针访问的连续内存块,因此,你不使用引用操作符。

因此,这样做:

scanf("%62s", & cString); 

是传递一个指针的指针(这不是一个错字)一char值。如果函数需要一个字符串,请不要传递对它的引用。

现在,我们来看看您的错误消息。编译器给你这个:

format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[64] 

什么它告诉你的是,你没有串。相反,你有一系列指向char的指针。

变化:

char cString[LENGTH] = {0}; 

到:

char cString[LENGTH]; 

和变化:

scanf("%62s", & cString); 

到:

scanf("%62s", cString); 

并且应该解决您的问题。

+1

数组不是指针。 – 2014-11-22 22:21:51

+0

@remyabel对不起,我的坏。我会解决这个问题。 – SevenBits 2014-11-22 22:22:47

+1

@ rowan.G我不是一个家伙,只是说“数组是指针”是不正确的,*特别是*如果前提是为了解决初学者的困惑。阅读[在C中,是数组指针还是用作指针?](https://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-used-as-pointers)。 – 2014-11-22 22:24:58

0

替换此:

scanf("%62s", & cString); 

与此:

scanf("%62s", cString); 

CSTRING已经是一个指针,当你指定数组,这是不言而喻的。您正在传入指针的地址,这是一种字符**

+1

没有。 'cString'显然不是一个指针**。想要重新读取错误消息或代码并重试? – Deduplicator 2014-11-22 22:13:38

+0

@Deduplicator说什么,那不是一个字符串。仔细观察。 – SevenBits 2014-11-22 22:21:36

相关问题