C ошибка в выводе манипулирующих массивов через функцию - PullRequest
1 голос
/ 25 апреля 2020

Хорошо, я написал эту простую программу, которая из массива char и ключевого слова сохраняет в другом массиве ту часть строки, которая начинается с этого ключевого слова.

Это работает, если я не использую любая функция для манипулирования массивом, но я не понимаю, почему она не работает, когда она обрабатывается через функцию, в этом случае нет вывода из printf.

Код, который не работает :

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

void createRequest(char *buffer) {
    strcat(buffer, "GET /vfolder.ghp HTTP/1.1\r\n");
    strcat(buffer, "User-Agent: Mozilla/4.0\r\n");
    strcat(buffer, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
    strcat(buffer, "Conection: Keep-Alive\r\n\r\n");
    strcat(buffer, "name=2&password=3");
}

void getParameters(char *buffer, char *parameters) {
    for (int i = 0; i < sizeof(buffer); i++) {
        if (strncmp(buffer + i, "name=", 5) == 0) { strcpy(parameters, buffer + i); }
    }
}

int main(int argc, char *argv[]) {
    char buffer[250];
    char parameters[250];

    memset(buffer, 0x00, sizeof(buffer));
    memset(parameters, 0x00, sizeof(parameters));

    createRequest(buffer);

    fprintf(stdout, "Your buffer is: \n%s\r\n", buffer);

    getParameters(buffer, parameters);

    printf("The parameters are: \n%s\r\n", parameters);
}

Код, который работает:

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

void createRequest(char *buffer) {
    strcat(buffer, "GET /vfolder.ghp HTTP/1.1\r\n");
    strcat(buffer, "User-Agent: Mozilla/4.0\r\n");
    strcat(buffer, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n");
    strcat(buffer, "Conection: Keep-Alive\r\n\r\n");
    strcat(buffer, "name=2&password=3");
}

int main(int argc, char *argv[]) {
    char buffer[250];
    char parameters[250];

    memset(buffer, 0x00, sizeof(buffer));
    memset(parameters, 0x00, sizeof(parameters));

    createRequest(buffer);

    fprintf(stdout, "Your buffer is: \n%s\r\n", buffer);

    for (int i = 0; i < sizeof(buffer); i++) {
        if (strncmp(buffer + i, "name=", 5) == 0) { strcpy(parameters, buffer + i); }
    }

    printf("The parameters are: \n%s\r\n", parameters);
}

1 Ответ

1 голос
/ 25 апреля 2020

Вы не должны использовать sizeof в getParameters функции.

Значение этой операции sizeof(char*), и это не то, что вы имели в виду.

Измените ее и вместо этого используйте strlen:

void getParameters(char *buffer, char *parameters) {
    for (int i = 0; i < strlen(buffer); i++) {
        if (strncmp(buffer + i, "name=", 5) == 0) { strcpy(parameters, buffer + i); }
    }
}

По сути, поскольку это char* (с нулевым окончанием), вы можете использовать strlen, чтобы найти его длину. Например, для массива целых чисел вам нужно будет передать число элементов в качестве дополнительного параметра.

...