2017-01-18 1 views
-1

Учитывая следующее, я получаю ошибку сегментации, и я не уверен, что это потому, что я тестирую указатель или другое вопрос.в C правильный способ проверить n-й символ == «x» в строке, переданной функции

Каков правильный способ проверить, является ли 4-й символ запятой?

строка считывается из ФИФО abc,def,xyz

char in[BUFFER] = {'\0'}; 
if ((in_fl = open(*fifofile, O_RDONLY)) == -1) 
    { 
    while (read(in_fl, in, BUFFER)>0) { 
     doParseInput(&in); 
    } 


void *doParseInput(char *inputread){ 
//copy string to use later.... 
char* theParsedString = calloc(strlen(inputread)+1, sizeof(char)); 
strcpy(theParsedString , inputread); 
if (strcmp(theParsedString[3], ",") == 0){ //causes seg fault 

Я также попытался использовать переданную строку непосредственно, но и сегментного вино

if (strcmp(inputread[3], ",") == 0){ //causes seg fault 
+0

'if (inputread [3] == ',') {' как вы сравниваете * char *. 'strcmp()' предназначен для сравнения * строк * (последовательность символов, заканчивающихся нулевым байтом). –

+0

См. Этот раздел [вопрос] (https://stackoverflow.com/questions/10490636/compare-between-a-char-in-a-string-to-a-given-char). На самом деле это не дубликат, так как вы запрашиваете решение C, но принятый ответ также есть. – qwattash

+1

Возможный дубликат [Сравнить между символом в строке с заданным символом] (http://stackoverflow.com/questions/10490636/compare-to-a-given-char) – qwattash

ответ

1

Чтобы передать буфер функции, не используйте &.
Вместо:

doParseInput(in); 

Для сравнения 4-й символ буфера (индекс == 3):

if (theParsedString[3] == ','){ 

(Обратите внимание на одинарные кавычки, то есть Character-Value, а не двойные кавычки , что будет означать "String")

+0

можете ли вы расширить или указать на некоторые документы «почему» не использовать & для передачи буфера. Используя как «&», так и без работы, мне интересно понять, насколько хорошая практика не используется, thx Art –

0

Во-первых, вы передаете неправильный тип аргумента doParseInput. Он ожидает char *, но вы передаете его char (*)[]. Ваш компилятор должен был предупредить вас об этом.

Другая проблема заключается в том, что вы используете сравнение строк для проверки одного символа. Вам нужно использовать константу символа (т. Е. Использовать одинарные кавычки, а не двойные кавычки), и сравнить это с элементом массива напрямую.

if (theParsedString[3] == ',') {