strtok () и ошибка сегментации - PullRequest
0 голосов
/ 04 марта 2019

У меня есть случай, когда я набираю "1111:2222" и "1111:" или ":2222".

Когда это "1111:2222" - я просто печатаю его.

Когда это"1111:" - Мне нужно установить значение по умолчанию для b = 0 или для случая, когда оно равно :2222 для a = 0.

Пожалуйста, как мне обработать этот случай?(У меня есть только один символ :, я обработал это условие, не показывать его, потому что это не важно)

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

int main () {
   char str[80] = "11111:";
   const char s[2] = ":";
   char *token;
   int a = 0;
   int b = 0;


   /* get the first token */
    token = strtok(str, s);
    a = atoi(token);
    printf( " %s\n", a );

    /* get the second token */
    token = strtok(NULL, s); // Here is seg.fault
    if (token != NULL)
        b = atoi(token);
    else    
        b = 0;

    printf( " %s\n", b );
   return(0);
}

1 Ответ

0 голосов
/ 04 марта 2019

Причиной ошибки сегментации является то, что целочисленные значения передаются в формате %s для printf().Затем printf() интерпретирует числа как указатели, которые указывают на строки.На самом деле они не указатели, а (в данном случае маленькие) целые числа, поэтому происходит чтение странного местоположения и возникает ошибка Сегментации.

После устранения проблемы путем изменения %s на %d или некоторых других форматов, которые принимаютцелые числа, этот код не сможет обработать :2222 регистр и присвоить 2222 a, а не b, как требуется.Это связано с тем, что strtok() удаляет префиксные символы, содержащиеся в разделителях.Поэтому, кажется, вам нужно проверить, является ли первый символ : самостоятельно, чтобы обработать этот случай.

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