2016-05-02 4 views
-3

Я просто узнал о массивах. Поэтому я попытался написать простое упражнение, в котором функция должна проверить, находится ли данный аргумент (или больше) в определенном массиве. Что-то вроде этого: ./main а -> списка уC: Проверка наличия элемента в списке

int main(int argc, char* argv[]){ 
int i,n; 
char a[]={'a','5ab','na','8s'}; 
for(i = 1; i < (argc); ++i){ 
    while (n < 4){ 
     if (argv[i] == a[n]){ 
      printf("y"); 
      break; 
     } 
    } 
} 
return 0; 

} 

Runnung это, я получаю предупреждение: «переполнение в неявной постоянной конверсии» и «мульти-символьный характер постоянная [-Wmultichar]» Ну, я говорю, что это имеет какое-то отношение к argv [i] == a [n]. Как я могу это исправить?

+3

Hm. Слишком много проблем ... Не знаю, с чего начать. Хорошо, литералы первого строчки написаны с двойными кавычками. –

+2

Вы не можете использовать символ таким образом, и вы не можете проверить равенство строк таким образом. Вы действительно создаете 'char * a []', и вам нужно посмотреть справочную страницу для 'strcmp' –

+1

. Две основные проблемы - непонимание того, как строки работают на C, и что' n' никогда не устанавливается ни на что , Последнее легко исправить, вам нужен еще один цикл 'for', но первые строки в C дьявольски сложны. Я предлагаю вам работать с помощью учебника, например [Learn C The Hard Way] (http://c.learncodethehardway.org/book/). – Schwern

ответ

3

В C, есть два связанных текстовых типов данных: char и строки. Строка - это указатель на массив символов, который по соглашению заканчивается символом NUL ('\ 0'). A char - это один байт, представляющий символ ASCII.

Вы создаете строковые литерал путем составления последовательности символов, содержащихся между открытием и закрытием двойных кавычек: "this is a string literal"

С другой стороны, вы создаете char буквального путем составления одного символьное выражения - возможно, с обратная косая черта - между двумя одинарными кавычками: 't', 'h', 'e', ​​'s', 'e', ​​'', 'a', 'r', 'e', ​​'', 'c', 'h', 'a', 'r', '', 'l', 'i', 't', 'e', ​​'r', 'a', 'l', 's' , '\ n'

После появления кодовых страниц и многобайтовых символов encodin gs, C добавлена ​​поддержка для «широких символов» (то есть более 8 бит, используемых для хранения одного элемента) и для «многобайтовых символов» (то есть кодировки символов, которые использовали 8-битные значения, но требуется несколько кодов для кодирования одного символа).

Компилятор видит свою линию инициализации массива:

char a[]={'a','5ab','na','8s'}; 

И при условии, что «5AB» и «на» и «» 8s являются попыткой, вами, чтобы указать ширину или мульти- байтовый символ буква. Он знает, что символы (не строки) заключены в одинарные кавычки.Это знает что вы используете тип char. Таким образом, это не могут быть строки. Но они не являются многобайтовыми символами.

В действительности, я думаю, вы предназначались для того, чтобы они были струнами. Вероятно, вы исходите из python или bash, perl или другого языка, где одиночные кавычки могут разграничить строки. Но это не C.

Чтобы создать список строк, вам необходимо знать, что строки имеют тип char * (или const char *). Затем вы хотите создать массив из них - это ваш список:

const char *list_of_str[] = { 
    "hello", 
    "my name", 
    "is George" 
}; 

Вы заметите, что argv список строк. ;-)

0

У вас не может быть «5ab» в вашем массиве []. Массив символов может содержать только одиночные символы, такие как «a», «5» или «\ n».

Кроме того, я не уверен, что это хорошая идея для i < (argc) в вашем цикле for. argc - количество элементов, которые вы передаете, когда запущена ваша программа C. Попробуйте i < 4 и убедитесь, что i в вашем цикле for начинается с 0.

+0

Есть путь, более ошибочный. –

+0

@David спасибо. Я добавил дополнительные предложения. –

0

В массиве символов каждое пространство памяти представляет собой один байт, который представляет один символ. Попробуйте использовать строки вместо символов. char a [] = {'a', '5ab', 'na', '8s'};

+0

Возможно, вы захотите показать пример, чтобы он знал, что делать :) –

+0

... и охватывать все другие причины, по которым этот код не работает. –

0

Массив имеет только один тип, в вашем случае char.

Кроме того, ваш цикл while неправильный (потенциально бесконечный). Что такое ценность n? А где/что такое условие перерыва?

  1. Вы должны инициализировать n «s значение
  2. Вы должны обеспечить завершение цикла
+0

Цикл while * может быть бесконечным в зависимости от того, что компилятор решает инициализировать 'n', если что угодно. – callyalater

+0

Очень вероятно быть бесконечным, потому что 'n', являясь локальной целочисленной переменной, не инициализируется. Он содержит мусор. – Elyasin

+0

Правда. но если 'n' имеет значение мусора, например' 34253', условие является ложным и тело цикла никогда не выполняется. Если значение мусора больше или равно «4», ничего не происходит. Это похоже на игру в русскую рулетку. Будет ли значение меньше, чем '4'? Либо его программа ничего не делает, либо имеет бесконечный цикл. Его собираются выстрелить в любом случае. – callyalater

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