Обратите внимание, что вы должны получить предупреждение о рассогласовании прототипа между объявлением 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()
были успешными; Я должен быть ленив.
и, кроме ответов, полученных вами от других, избегайте использования полученных результатов; насколько это возможно, см. раздел «Ошибки» для этой справочной страницы для получения дополнительной информации http://linux.die.net/man/3/gets –