2014-10-17 3 views
-1

есть функция в программе, которая должна искать символ в строковом файле. В главной строке объявляются и значение задаются пользовательским вводом, как это:Поиск символов в программировании С

char studentdata[40]; 
scanf("%s", &studentdata); 

В рамках задачи, пользователь всегда будет написать символ «/» в середине строки, которая будет иметь быть найденным. Мой код для поиска:

int i=0; 
char z = '/'; 
while (studentData[i]!=z) 
    { 
     i++; 
    } 

studentData переменная функции объявлена ​​как

char *studentData 

Идея заключалась в том, что после переменной цикла я содержал положение символа г, но программа никогда не приходит из цикла и сбоев. Вероятно, это новичок, поскольку я новичок в этом ... Спасибо за помощь!

+1

Вы пробовали искать strchr? http://www.tutorialspoint.com/ansi_c/c_strchr.htm – KRUKUSA

+3

'while (studentData [i]! = z && studentData [i]! = '\ 0')' – chux

+1

Предлагать отказаться от '&' из 'scanf (" % s ", & studentdata);' -> 'scanf ("% 39s ", studentdata);' – chux

ответ

0

Вместо

scanf("%s", &studentdata); 

попробовать

scanf("%s", studentdata); 

потому studentdata уже указатель. В настоящее время вы скажите scanf, чтобы записать результат в место, где указывается адрес указателя, а не то место, которое указывает указатель (это перезапишет фактический указатель и, возможно, смежную память, что приведет к непредсказуемому поведению).

отметить также два комментария от @chux, что вы можете предотвратить вашу программу от сбоев, если «/» не найден:

Изменение петли до конца, когда он встречает нулевой символ:

while (studentData[i] != z && studentData[i] != '\0') 

Разрешить только до 39 символов ввода из зсапЕ (ведение 40th для нулевого терминатора):

scanf("%39s", studentdata); 
+0

Можно использовать strcspn Если вы становитесь длиной строки, если указанный символ не найден. Например. 'i = strcspn (studentData,"/");' – BLUEPIXY

+0

@BLUEPIXY: Я предполагаю, что это домашнее задание. Если это так, возможно, цель состоит в том, чтобы изучить мыслительный процесс, стоящий за такими функциями, как 'strcspn'. –

0

Поскольку studentdata является указателем при Typ e &studentdata Это означает адрес указателя.

Так что вы действительно хотите это значение:

scanf("%s", studentdata); 
+1

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

+0

@PeterNagy Нет проблем. – FunctionR

1

Во-первых, вам нужно передать данные студентов в зсапЕ() правильно. Использование:

scanf("%s", studentdata); 

У вас есть это, вы передаете указатель на указатель.

Всегда разумно использовать #define для размера массива. Вы должны добавить:

#define SDSIZE 40 

и объявить массив как:

char studentdata[SDSIZE]; 

Это делает обслуживание гораздо проще. Вы увидите, что вам нужно использовать SDSIZE в нескольких местах ниже. Таким образом, если вам нужно изменить размер, вы просто изменяете #define, а не везде, где это используется, и меняя их все.

Чтобы избежать сбоя, вам необходимо проверить свою переменную индексации, i. Чтобы он не ошибался, вам также нужно следить за символом завершения строки (null). Таким образом, ваш цикл должен выглядеть следующим образом:

while(studentdata[i] != z && studentdata[i] != 0 && ++i < SDSIZE); 

Теперь, когда цикл завершается, i будет содержать индекс, где z был найден, он будет равен SDSIZE, если он не найден, или значение по индексу (studentdata[i]) будет null, если он не был найден. Испытайте вот так:

if(SDSIZE == i || studentdata[i] == 0) 
    printf("Not found\n"); 
else 
    // do what you need to do with the result here. 

Это должно дать вам то, что вы ищете.

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