2013-05-19 2 views
0

Этот код, который я написал, должен читать предложение и символ, проверяющий происхождение этого символа в этом предложении. Он работает, когда я пишу код в основном, но когда я пытаюсь использовать функцию, он не работает. Проблема, которую я имею, - объявить строку и переменную char аргументам функции. Что не так?Передача строки и символа функции

#include<stdio.h> 
#include<string.h> 
int occ(char*,char); 
int main() 
{ 
    char c,s[50]; 
    printf("enter a sentece:\n");gets(s); 
    printf("enter a letter: ");scanf("%c",&c); 
    printf("'%c' is repeated %d times in your sentence.\n",c,occ(s,c)); 
} 
int occ(s,c) 
{ 
    int i=0,j=0; 
    while(s[i]!='\0') 
    { 
     if(s[i]==c)j++; 
     i++; 
    } 
    return j; 
} 
+0

и, кроме ответов, полученных вами от других, избегайте использования полученных результатов; насколько это возможно, см. раздел «Ошибки» для этой справочной страницы для получения дополнительной информации http://linux.die.net/man/3/gets –

ответ

4

Обратите внимание, что вы должны получить предупреждение о рассогласовании прототипа между объявлением occ и его определением, среди множества других предупреждений компиляции.

Когда вы пишете:

int occ(s,c) 
{ 

вы используете предварительно стандартного или K & R стиль функции и типы по умолчанию аргументов - так как вы не указали какой-либо тип - это int. Это нормально для параметра char; это не нормально для параметра char *.

Таким образом, все остальное, кроме, вы должны написать:

int occ(char *s, char c) 
{ 

согласиться с прототипом.

Когда я компиляции кода, я получаю ошибки компиляции:

$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -c wn.c 
wn.c:4:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes] 
wn.c: In function ‘main’: 
wn.c:4:5: warning: old-style function definition [-Wold-style-definition] 
wn.c: In function ‘occ’: 
wn.c:11:5: warning: old-style function definition [-Wold-style-definition] 
wn.c:11:5: warning: type of ‘s’ defaults to ‘int’ [enabled by default] 
wn.c:11:5: warning: type of ‘c’ defaults to ‘int’ [enabled by default] 
wn.c:11:5: error: argument ‘s’ doesn’t match prototype 
wn.c:3:5: error: prototype declaration 
wn.c:11:5: error: argument ‘c’ doesn’t match prototype 
wn.c:3:5: error: prototype declaration 
wn.c:14:12: error: subscripted value is neither array nor pointer nor vector 
wn.c:16:13: error: subscripted value is neither array nor pointer nor vector 
wn.c:11:5: warning: parameter ‘s’ set but not used [-Wunused-but-set-parameter] 

Примечание: это не займет много исправить код - это компилируется. Однако он использует fgets(), а не gets(). Вы должны забыть, что существует gets(), и ваш учитель должен быть уволен за упоминание о его существовании.

Пример запуска:

$ ./wn 
enter a sentence: amanaplanacanalpanama 
enter a letter: a 
'a' is repeated 10 times in your sentence. 
$ 

Код:

#include <stdio.h> 

int occ(char*, char); 

int main(void) 
{ 
    char c, s[50]; 
    printf("enter a sentence: "); 
    fgets(s, sizeof(s), stdin); 
    printf("enter a letter: "); 
    scanf("%c", &c); 
    printf("'%c' is repeated %d times in your sentence.\n", c, occ(s, c)); 
    return 0; 
} 

int occ(char *s, char c) 
{ 
    int i=0, j=0; 
    while (s[i]!='\0') 
    { 
     if (s[i]==c) 
      j++; 
     i++; 
    } 
    return j; 
} 

Код должен проверить, что оба fgets() и scanf() были успешными; Я должен быть ленив.

+0

Спасибо @ Джонатан Леффлер –

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