首页 > 解决方案 > 通过函数输出操作数组时出现 C 错误

问题描述

好吧,我编写了这个简单的程序,它从一个 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);
}

标签: carraysmemorydynamic

解决方案


你不应该sizeofgetParameters函数中使用。

此操作的值为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它来找到它的长度。例如,对于整数数组,您必须将元素的数量作为额外参数传递。


推荐阅读