【问题标题】:Comparing char* in C using strcasecmp使用 strcasecmp 比较 C 中的 char*
【发布时间】:2015-10-17 00:42:16
【问题描述】:

我正在从套接字读取字节并将其复制到 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 新手,感谢任何帮助。

【问题讨论】:

  • 你确定currentTokens[0] 真的正确吗:没有多余的字符,比如换行符吗?
  • 当我 printf currentTokens[0] 它给出正确的输出就是我的意思。
  • MikeCAT 的意思是,如果currentTokens[0]quit,那么printf("%s1\n", currentTokens[0]); 应该在不同的行上打印quit1 而不是quit1
  • @Antithesis 终止字符、换行符、制表符、空格等很难注意到,除非您使用像 Chrono 提到的技巧。尝试在应该删除此类字符的文本之前和之后修剪用户输入。
  • 可以使用these functions辅助调试,具体是print_escstr函数。空格字符以外的所有可打印字节都正常打印,空格字符和不可打印字节使用&lt;XX&gt; 形式的转义符打印,其中XX 是表示单个字节的2 个字符的十六进制序列。跨度>

标签: c arrays


【解决方案1】:

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

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

在 finalStr 的特殊情况下,我认为根本没有执行复制的充分理由。直接读入它(不要忘记空终止。)或者,使用标准 C 库而不是底层 posix 层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2013-02-09
    相关资源
    最近更新 更多