проблема с массивами символов в сетевом программировании - PullRequest
0 голосов
/ 15 марта 2011

У меня есть следующее: nodeID = abcde.abc.edu_12345 и мне нужно добавить подчеркивание и 10-значное значение, возвращаемое time (), чтобы создать следующее: node_inst_ID = abcde.abc.edu_12345_1016320007 где 1016320007 - это 10-значное значение, возвращаемое функцией time (). Я пытаюсь следующий код, но он не работает:

#define NODE_ID_LENGTH 20
#define NODE_INST_ID 31
char nodeID[NODE_ID_LENGTH]
char node_inst_ID[NODE_INST_ID];
int main()
{
    /*
    Building of nodeID is a bit complex. So its hard to put all the code here. But printing the following at this point gives this
          for(int i = 0; i < NODE_ID_LENGTH; i++)
            {
              printf("%c", nodeID[i]);
            }
    gives
    abcde.abc.edu_12345
    If you need to know any more info about nodeID, I can post the print out of things that you suggest. 
    */

    long int seconds = time(NULL);
    char buf[10];
    sprintf(buf, "%ld", seconds);
    snprintf(&node_inst_ID[0], 20, "%s", &nodeID[0]);
    node_inst_ID[20] = '_';
    node_inst_ID[21] = '\0';
    cout<<"Node instance ID = "<<node_inst_ID<<endl;

    /* 
    I havent yet added the code for appending the time stamp. But I am expecting a print out for the above code like this:
    Node instance ID = abcde.abc.edu_12345_
    But the code is printing only
    Node instance ID = abcde.abc.edu_12345
    It is not adding the underscore at the end. 
    */
}

Кто-нибудь может указать, в чем ошибка? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Вы запрограммировали подчеркивание на индекс 20 node_inst_ID, однако оно содержит только 18 символов и нулевой терминатор на этом этапе:

0123456789012345678
abcde.abc.edu_12345

Так как вы не перезаписываете нулевой терминатор, на этом распечатка останавливается, когда вы печатаете результат. Не принимайте положения и длины для строк; вместо этого используйте функции библиотеки строк для управления ими.

1 голос
/ 15 марта 2011
snprintf(&node_inst_ID[0], 20, "%s", &nodeID[0]);
node_inst_ID[20] = '_';
node_inst_ID[21] = '\0';

Предполагается, что длина строки ровно 20 символов - это не так.Попробуйте это:

snprintf(&node_inst_ID[0], 20, "%s", &nodeID[0]);
strcat(node_inst_ID, "_"); // strcat is safe in this context, usually you should use strncat.

РЕДАКТИРОВАТЬ: Если вы все еще хотите использовать snprintf, простой способ:

int len = strlen(node_inst_ID);
snprintf(node_inst_ID + len, sizeof(node_inst_ID) - len, "%whatever", the, args);
0 голосов
/ 15 марта 2011

nodeID - всего 19 символов. Таким образом, он имеет терминатор \0 в позиции 19, как и копия, которую вы делаете в node_inst_ID. Затем вы сохраняете еще кое-что начиная с позиции 20 после завершающего нулевого байта . Таким образом, ваше подчеркивание находится после конца строки.

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