C: событие bash не найдено - PullRequest
       5

C: событие bash не найдено

0 голосов
/ 20 ноября 2018

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

./main "Hello World!" "ld"
-bash: !": event not found

что это такое, что происходит

вот главное:

#include <stdio.h>
#include <err.h>
#include <string.h>
int main (int argc, char *argv[]) 
{

int p = 0;
int q = 1;
int place = 0;
int check = 0;
char position[10] = ""; // i think the error is here

while (argv[1][p] != '\0')
{
    if (argv[1][p] == argv[2][0])
    {
        place = p;
        while (argv[2][q] != '\0' && argv[1][p + q] != '\0' && argv[2][q] == argv[1][p + q])
            { 
            q += 1;
            }
        if (argv[2][q] == '\0')
        {
            check = 1;
            printf("%s\n", argv[1]); //i think the error is here
            for (int n = 0; n < place; n += 1) //i think the error is here
            {
                strcat(position, " "); //i think the error is here
            }
            strcat(position, "^"); //i think the error is here
            printf("%s\n", position); //i think the error is here

        }
    }
    p += 1;
}
if (check == 0)
{
    printf("Not found!\n");
}

return 0 ; // return 0
}

Я добавил комментарий, чтобы вы могли помочь

, а также как я могу создать

char position[10] = "";

без указания длины Iпробовал

char position[] = "";

но не компилируется

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я думаю, что "!"возможно вызывает некоторые проблемы с вашей оболочкой bash.Я запустил его без проблем.Если вы попробуете мой код, и он потерпит неудачу, попробуйте запустить его как

. / Main "Hello World" ld

Логика в вашем коде сбивает с толку, потому что вы пытаетесь использовать argv [1] и argv [2] напрямую.это можно сделать, но способ написания очень сложен для понимания.

Я уменьшил сложность кода, переименовав переменные, чтобы вам было легче следовать логике.

Я также добавляю подпрограмму для сравнения строк.Конечно, есть функция библиотеки strcmp (), я не уверен, что вы избежали этой функции из-за какого-то требования.Вы можете изменить это, чтобы использовать std strcmp ().

Хороший код должен быть задокументирован именами переменных.Вот что я придумал:

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

/* compare two c strings.  Return 0 if equivalent. Return -1 if not.
 * Assumes that the strings are terminated with a '\0' character */
int homegrown_strcmp(char* str1, char* str2) {

    while( *str2 != '\0') {
        if(*str1 != *str2)
            return -1;
        str1++;
        str2++;
    }
    return 0;

}

int main(int argc, char *argv[])
{


    char* haystack = argv[1]; /* This is the string we are searching inside */
    char* needle = argv[2]; /* This is what we are looking for */

    char* poker = haystack;  /* We will use this to poke into our haystack until
 * we find our needle or fail */

    unsigned int position = 0;
    while(*poker != '\0') {
        if(homegrown_strcmp(poker, needle) == 0) {
            printf("Found at position %u\n", position);
            return 0;
        }
        poker++;
        position++;
    }
    printf("Not found\n");
    return -1;
}
0 голосов
/ 20 ноября 2018

Короткий ответ

С восклицательными знаками используйте одинарные кавычки.

./main 'Hello World!' 'ld'

Длинный ответ

Восклицательный знак делает что-то смешное в Bash. Подробнее ... unix.stackexchange .

Восклицательный знак является частью расширения истории в bash.Чтобы использовать его, он должен быть заключен в одинарные кавычки.

Даже пытаясь! "С echo дает

$ echo "Hello World!"
-bash: !: event not found

Вы можете использовать двойные кавычки,но вам может понадобиться черная косая черта.

Обратите внимание, что в двойных кавычках обратная косая черта перед восклицанием предотвращает расширение истории, НО обратная косая черта в этом случае не удаляется.

Так что ./main "Hello World\!" "ld" также будет работать, но вам может потребоваться учитывать черный слеш в вашем C / C ++.

Обратите внимание, что поведение восклицательного знака могло измениться. Выполнение echo "Hello World!" заставит работать некоторыеверсии bash. Кредиты Бенджамину В.

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