Что означает слово [0] при сравнении двух строк с помощью strcmp - PullRequest
0 голосов
/ 04 апреля 2019

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

Я могу сделать это двумя способами: один:

if (strcmp(line,"exit") == 0) 
        break;

, а другойэто:

if (strcmp (words[0], "exit")==0)
        return 0;

Не могу понять, что означает слово [0] в приведенном выше коде?

    void tokenize(char *line, char **words, int *nwords);
    int main()
    {
    char line[MAX_LINE], *words[MAX_WORDS], message[MAX_LINE];
    int stop=0,nwords=0;

    while(1)
    {
            printf("OSP CLI $ ");

    /* my code*/

    if (NULL==fgets(line , MAX_LINE, stdin))
    return 0;
    printf("%s",line);



    /* my code ends */

            /* read a line of text here */

            tokenize(line,words,&nwords);

    /* --Not using this code as i found my own---
    if (strcmp (words[0], "exit")==0)
    return 0;
    */
    if (strcmp(line,"exit") == 0) 
    break;

1 Ответ

2 голосов
/ 04 апреля 2019
char line[MAX_LINE];

line - массив символов MAX_LINE длины. Массивы символов, оканчивающиеся нулевым байтом, обычно называются «строками» в C.

char *words[MAX_WORDS];

words является массивом MAX_WORDS длины указателей на символы (прочитайте это дважды).

fgets(line , MAX_LINE, stdin)

С cppreference fgets :

Считывает не более 1 символа из заданного потока файлов и сохраняет их в массиве символов, на который указывает str. ... Если ошибок не возникает, записывает нулевой символ в позиции сразу после последнего символа, записанного на стр.

fgets сохраняет строку в массиве line.

 tokenize(line,words,&nwords);

Я не знаю источника этой функции, поэтому она, вероятно, совершает магию и, возможно, записывает в массив words, назначая указатели на действительные строки для него. Поэтому после него words массив инициализируется с действительными указателями на строки.

if (strcmp(line,"exit") == 0) 

Сравнивает нулевые символы в массиве line с массивом {'e','x','i','t','\0'}.

if (strcmp(words[0], "exit") == 0) 

Итак, words - это массив указателей. Берём первый указатель, т.е. words[0]. Первый указатель, вероятно, указывает на массив символов с нулевым символом в конце, который был инициализирован внутри tokenize. Так что words[0], вероятно, указывает на правильную строку (массив символов). Мы сравниваем эту строку с массивом символов "exit".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...