使用strcasecmp比较C中的char *

时间:2015-10-17 00:42:16

标签: c arrays

我从套接字读取字节并将其复制到char数组中。

char usrInputStr[256];
if ((rbytes = read(STDIN_FILENO, usrInputStr, 256)) < 0) {
    perror("Read error: ");
    exit(-1);
}
char finalStr[rbytes + 1];
memcpy(finalStr, usrInputStr, rbytes);

现在我在堆上分配一个数组并将字符串拆分为单词并将每个单词放在char数组的数组中。这是执行此操作的代码。

char** currentTokens = (char**)malloc(sizeof(char*) * 256);
for(int i = 0; i < 256; i++) {
    currentTokens[i] = (char*)malloc(sizeof(char) * 256);
}

int sz = splitStrToArray(finalStr, currentTokens);

splitStrToArray函数的定义在这里,这很好。

int splitStrToArray(char* str, char** arr) {
    int count = 0;
    char* buffer;
    int len = strlen(str);

    for (int i = 0; i < len ; ++i) {
        if(isspace(str[i])) {
            count++;
        }
    }

    int index = 0;
    buffer = strtok(str, " ");
    while(buffer != NULL) {
        memcpy(arr[index], buffer, strlen(buffer));
        index++;
        buffer = strtok(NULL, " ");
    }
    return count;
}

然而,当我将它与用户输入进行比较时,它会返回零,因此两个字符串不匹配。

if(strncasecmp(currentTokens[0], "quit") == 0) {
    printf("quit" );
    breakTrigger = 1;
} else if(strcasecmp(currentTokens[0], "q") == 0) {
    printf("q");
    breakTrigger = 1;
} else {
    callback(currentTokens, sz, port);
}

我已经检查了currentTokens [0],这个词是正确的。 当我尝试在int中获取strcasecmp的返回值并打印它时,我得到Segmentation Fault。 我是C的新手,感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的所有字符串都不会以空值终止,因此您始终存在未定义的行为。使用memcpy复制字符串几乎不是你想要的。

如果可以的话,您应该考虑使用strdup。否则malloc然后strcpy。

在finalStr的特定情况下,我认为没有充分的理由来执行副本。只需直接读入它(并且不要忘记null终止。)或者,使用标准C库而不是底层posix层。