2015-06-28 2 views
-1

Мой код дает мне ошибку сегментации, и я не могу найти то, что я делаю неправильно:Сегментация Неисправность C

#include <stdio.h> 
#include <string.h> 
char find(char name[], char allNames[][10], int length) 
{ 
int i=0; 
for (i = 0; i < length; i++) { 
if (strcmp(allNames[i],name) == 1) { 
printf("%i",i); 
return *name; 
} 
} 
return -1; 
} 

main(){ 
    char allNames[][10] = {"cat","dog","frog","log","bog"}; 
    char name[] = "log"; 
int length=5; 
    printf("%s",find(name,allNames,length)); 

} 

Я очень увлечена, чтобы понять все механизмы, происходящие здесь и что я делаю неправильно для завтрашнего экзамена. Спасибо за вашу помощь!

EDIT: Действительно оцените ответы и информацию ребята! Я на самом деле очень новичок в C и просто привык к тому, что означает каждая вещь. Частный вопрос экзамена, который я рассматриваю:

(a) Следующая функция предназначена для поиска имени строки в массиве allNames. Если найдено, он возвращает позицию имени в массиве. Если не найдено , он возвращает -1. Измените код так, чтобы он работал правильно.

int find(char name[], char allNames[][10]) 
{ 
for (i = 0; i < 10; i++) { 
if (allNames[i] == name) { 
return name; 
} 
} 
return -1; 
} 

И я пытаюсь получить программу для работы в пределах этих параметров. Ура :)

+4

Выполнение неверных действий (1): не использовать отладчик. –

+0

ваш фикс retunrs char. не char *. – wildplasser

+0

Отметьте свой код, проверьте предупреждения gcc. –

ответ

2

Непосредственная причина для Segmentation Fault здесь потому, что код попытался напечатать char типа с %s (который нуждается в значении адреса).

void main() 
{ 
char c = 'a'; 
printf("%s", c); // will cause Segmentation fault here 
} 

Назад к коду, который

char find(char name[], char allNames[][10], int length)//return char 
printf("%s",find(name,allNames,length)); 

Минимальное изменение, чтобы сделать его работу следующим образом,

1) Для того, чтобы вернуть обугленного *

char* find(char name[], char allNames[][10], int length)//return char* 
{ 
    int i=0; 
    for (i = 0; i < length; i++) { 
    if (strcmp(allNames[i],name) == 0) { // here should 0 
     printf("%i",i); 
     return name; // change name* to name 
    } 
} 
    return NULL; // change to NULL 
} 
//to print 
printf("%s",find(name,allNames,length)); 

2) вернуть значение позиции e

int find(char name[], char allNames[][10]) 
    { 
     for (i = 0; i < 10; i++) { 
      if (allNames[i] == name) { 
      return i; // here, change to return i 
     } 
    } 
    return -1; 
    } 

    //then, you can print like this 
    printf("find at position: %d",find(name,allNames,length)); 
    //or to print string by 
    int pos = find(name,allNames,length); 
    if(pos >= 0) 
     printf("find the string: %s",allNames[pos]); 
3

http://coliru.stacked-crooked.com/a/d400c9a56d732446

#include <stdio.h> 
#include <string.h> 
char* find(char name[], char allNames[][10], int length) 
{ 
    int i=0; 
    for (i = 0; i < length; i++) { 
     if (!strcmp(allNames[i],name)) { 
      printf("%i",i); 
      return name; 
     } 
    } 
    return NULL; 
} 

int main(){ 
    char allNames[][10] = {"cat","dog","frog","log","bog"}; 
    char name[] = "log"; 
    int length=5; 
    printf("%s",find(name,allNames,length)); 

} 

Возвращающиеся один char не будет делать вам никакой пользы, если вы пытаетесь вернуть строку. Я также предлагаю вам вернуть NULL, если вы не можете найти строку.

Также включают int перед главным; это лучший стиль.

+0

По-видимому, в коде в вопросе он возвращает '* name', который действительно является' char', не должен быть ошибкой во время выполнения из-за этого ?? : \ – user007

+1

@ user007 Он не должен возвращать персонажа в любом случае; он задает печать строки, так зачем ему возвращать персонажа? Сама его функция возвращает неправильный тип. Также может быть, что он не может найти завершающий символ «\ 0», когда он пытается «printf()». – VermillionAzure

+0

'strcmp (allNames [i], name)' -> '! Strcmp (allNames [i], name)' или 'strcmp (allNames [i], name) == 0' – BLUEPIXY

2

Этот код является неправильным на нескольких уровнях.

НКУ -Wall -Wextra показывает:

meh.c:15:1: warning: return type defaults to ‘int’ [-Wreturn-type] 
main(){ 
^ 
meh.c: In function ‘main’: 
meh.c:19:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=] 
    printf("%s",find(name,allNames,length)); 
^
meh.c:21:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 

Что с этим делать? Вы компилируете с включенными предупреждениями?

Я игнорирую отсутствие отступов.

#include <stdio.h> 
#include <string.h> 
char find(char name[], char allNames[][10], int length) 

Что? Как насчет: char * name, ** list, int size)

{ 
int i=0; 

Зачем устанавливать его здесь 0?

for (i = 0; i < length; i++) { 
if (strcmp(allNames[i],name) == 1) { 
printf("%i",i); 
return *name; 

Вы прочитали man-страницу strcmp? Он возвращает ZERO, когда строка соответствует, поэтому этот код не имеет смысла.

* имя типа char, но вы не хотите возвращать символ. Вы хотите вернуть указатель, нет?

Ну, учитывая, что вы подаете это в% s в printf, что вы ожидаете здесь? Обычно возвращается NULL.

} 

main(){ 

Это устаревший синтаксис, я не знаю, где его украли. Используйте 'int main (void)'.

char allNames[][10] = {"cat","dog","frog","log","bog"}; 

Обычно люди просто возвращают такие массивы с нулевым указателем, так что они могут повторяться снова и нет необходимости передавать что-либо о размере.

char name[] = "log"; 

Почему не char * name = "log".

int length=5; 

Неверный. Он фиксирует количество сохраненных строк в таблице allNames. printf ("% s", find (name, allNames, length));

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