Проверка наличия специальных символов в строке (в C) - PullRequest
0 голосов
/ 14 декабря 2018

Почему каждое слово входит в оператор if, проверяя, заканчивается ли строка символом ',', а другое проверяет, заканчивается ли оно символом '' '.

Я вижу такие слова:

"held"
"hand"
"bond"
"like"
"was"
"her"
"familliar"

(все вышеперечисленное является просто примерами слов, которые входят в оператор if

void RemoveOddSigns(char *word){

    if(word[0] == '"'){
        strncpy(word, word + 1, strlen(word));
    }

    if(word[strlen(word - 1)] == '"'){
        word[strlen(word) - 1] == '\0';
    }

    if((word[strlen(word - 1)] == ',')){
        word[strlen(word) - 1] == '\0';
    }

Кто-нибудь знает, почему такие слова считают их окончание " или ,

1 Ответ

0 голосов
/ 14 декабря 2018

Внимательно посмотрите на скобки в этих двух строках:

if((word[strlen(word - 1)] == ',')){
    word[strlen(word) - 1] == '\0';
}
           Here    ^   ^

Асимметрия неправильная.Начало поиска до начала слова - неопределенное поведение.Я думаю, что вторая строка более правильная, но вам нужно заменить == на =, чтобы присвоить новое значение (как указано paxdiablo в комментарии ),Эта проблема также затрагивает предыдущий абзац кода.

if (word[strlen(word) - 1] == ',')
    word[strlen(word) - 1] = '\0';

Кроме того, у вас технически неопределенное поведение с strncpy(word, word + 1, strlen(word)); - исходный и целевой массивы не могут перекрываться (формальный прототип для strncpy()char *strcat(char * restrict s1, const char * restrict s2);, где restrict означает «нет перекрытия между s1 и s2).Используйте memmove() - это позволяет перекрывать копии - но вам нужно знать, какова длина строки, и не забывайте копировать нулевой байт, чтобы вывод тоже представлял собой строку.

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