2014-11-22 3 views
-3

Моя программа должна дать мне длину, самый высокий и самый низкий символ слова. Когда я скомпилировать программу, я получаю ошибку:ошибка: формат '% 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

BTW: Абсолютно бесполезно добавлять добавление форвардной декларации * после * определения. Просто оставьте это. – Deduplicator

+0

@Deduplicator Они, возможно, были объявлены в отдельных исходных файлах, и он правильно включил другую функцию, потому что считал, что это может иметь какое-то отношение к его проблеме. – SevenBits

+0

@SevenBits: Вполне возможно. Это либо не обрезает пример достаточно, что бывает легко, либо фактическое отсутствие понимания. Хотя я не мог сказать, что. Ты можешь? – Deduplicator

ответ

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

Массивы не являются указателями. –

+0

@remyabel Извините, мой плохой. Я исправлю вопрос. – SevenBits

+1

@ rowan.G Я не являюсь членом, просто неправильно говорить, что «массивы - это указатели», * особенно *, если предпосылка заключается в устранении путаницы для новичка. Чтение [В C, указатели массивов или используемые в качестве указателей?] (Https://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-used-as-pointers). –

0

Заменить это:

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

с этим:

scanf("%62s", cString); 

CSTRING уже указатель, так как при указании массива, что подразумевается. Вы проходили по адресу указателя, который был типом char **

+1

Нет. 'cString', очевидно, ** не указатель **.Хотите перечитать сообщение об ошибке или код и повторите попытку? – Deduplicator

+0

Что сказал @Deduplicator, это не строка. Присмотрись. – SevenBits

Смежные вопросы