2013-08-03 5 views
0

, похоже, не видит мою ошибку здесь, когда я компилирую и запускаю, я просто получаю сообщение «Поиск:», я ввожу то, что должно показывать результат, но ничего не происходит и просто выходит.Проблема, связанная с массивом

Я воссоздал этот код точно (из того, что я вижу!) Из книги Head First C, но он не работает одинаково, кажется, что они отображают результаты при поиске.

Так что поразите меня, ребята, что я сделал не так? Заранее спасибо!!

Btw, массивы + указатели массива делают мою голову в lol.

Вот код:

#include <stdio.h> 
#include <string.h> 

char tracks[][80] = 
{ 
    "I left my heart in Harvard Med School", 
    "Newark, Newark - A wonderful town", 
    "Dancing with a Dork", 
    "From here to maternity", 
    "The girl from Iwo Jima", 
}; 

void find_track(char search_for[]) 
{ 
    int i; 
    for (i = 0; i < 5; i++) 
    { 
     if (strstr(tracks[i], search_for)) 
      printf("Track %i: '%s'\n", i, tracks[i]); 
} 
} 

int main() 
{ 
    char search_for[80]; 
    printf("Search for: "); 
    fgets(search_for, 80, stdin); 
    find_track(search_for); 
    return 0; 
} 
+1

Вы наберете «Девушка из Иводзимы»? –

ответ

4

fgets функция, как указано here, включает в себя новую линию (\n) характер, так как это считается допустимым символом:

Символ новой строки делает fgets перестает читать, но считается действительным символом функции и входит в строку, скопированную на str.

Это означает, что вы собираетесь проверить, например:

"I left my heart in Harvard Med School" 

с

"I left\n" 

поэтому матч не происходит. Вы можете попробовать использовать gets или заменить \n символ с NUL (\0):

char search_for[80]; 
fgets(search_for, 80, stdin); 
search_for[strlen(search_for)-1] = '\0'; 
1

В fgets человек страница:. «Чтение останавливается после EOF или символа новой строки Если символ новой строки, она хранится в буфер. Конечный нулевой байт ('\ 0') сохраняется после последнего символа в буфере. "

Итак, в вашем коде, после того, как нажата окончательная «Ввод», значение, хранящееся в search_for, на самом деле «what_you_type» + «\n». Но tracks не содержит никаких «\n», это не удивительно, если вы не нашли то, что набрали.

Изменить tracks на:

char tracks[][80] = 
{ 
    "I left my heart in Harvard Med School\n", 
    "Newark, Newark - A wonderful town\n", 
    "Dancing with a Dork\n", 
    "From here to maternity\n", 
    "The girl from Iwo Jima\n", 
}; 

и введите целое предложение или что-то вроде «Iwo Jima», вы обязательно найдете то, что вы ищете.

+0

Спасибо, ребята ... но интересно, что они не имеют \ n в книге, и их код, похоже, работает, и они ищут только слово, не нужно искать какое-либо предложение или что-то еще. Это их код. ! [скриншот страницы ebook] [1] [1]: http://i.stack.imgur.com/X25RC.png – spergy

+0

Возможно, книга недостаточно серьезная. Если вы добавите «' \ n' »в треки, вы можете найти его, только введя последнее слово каждого предложения, например« Jima »,« Iwo Jima »,« from Iwo Jima »и т. Д. –

+0

не достаточно серьезный? каждая книга, которую я прочитал до сих пор, что-то не так с ней, что вы предлагаете? – spergy

1

Ответ Джека в порядке.

Вы можете заменить

fgets (search_for, 80, STDIN);

от

зсапЕ ("% 79s", search_for);

Это ошибка в книге. Вы можете просмотреть остальные по адресу Errata for Head First C.

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