C内核字符串连接和比较

4

以下是我实现的strcat和strcmp函数供参考:

char *
strcat(char *dest, const char *src)
{
    int i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}

int strcmp(const char* s1, const char* s2)
{
    while(*s1 && (*s1==*s2))
        s1++,s2++;
    return *(const unsigned char*)s1-*(const unsigned char*)s2;
}

我正在开发一个内核,但遇到了一些棘手的问题。基本上,我正在构建这样一个字符串:

unsigned char current_cmd[100];

    char tmp[] = {kbdus[scancode], '\0'};
    if (scancode != 0x1C) // enter key
        strcat((char*)current_cmd, tmp);

然后我进行比较,看它是否与命令匹配:

if (strcmp((const char*)cmd, "help") == 0)
    puts((unsigned char*)"You can't do anything yet.\n");

然后我执行:
current_cmd = (unsigned char)'\0';

重置以供使用。

它可以使用,但我不太明白为什么或如何。有人能给我解释一下为什么我的代码有效吗?如果我的代码有问题,请指出。

第三个问题,char check[10] = {"help"};{'h', 'e', 'l', 'p', ...}是相同的吗?还是我漏掉了什么?

3个回答

2

为什么不能与文字直接比较?请将代码更改为以下内容:

unsigned char current_cmd[100];

char tmp[] = {kbdus[scancode], '\0'};
if (scancode != 0x1C) // enter key
    strcat((char*)current_cmd, tmp);

if (strcmp((const char*)cmd, "help") == 0)
    printf("You can't do anything yet.\n");

current_cmd[0] = '\0';

嗯,看来你是对的。我把普通比较和==混淆了。 - user1508519

1

current_cmd = (unsigned char)'\0'; 是错误的,current_cmd是一个数组,不能被赋值, 你可以使用 current_cmd[0] = '\0' 来重置一个字符串。

以及

char check[10] = "help";

是一样的:

char check[10] = {'h', 'e', 'l', 'p', '\0'};

但是
char check[10] = {"help"};

这是错误的,因为它意味着一个字符串数组,而不是字符。


1
这是一个适用的strcmp函数。

int             my_strcmp(char *str1, char *str2)
{
  int           i;

  i = 0;
  while (str1[i] || str2[i])
    {
      if (str1[i] != str2[i])
        return (str1[i] - str2[i]);
      i++;
    }
  return (0);
}

你可能想表达的是:while (str1[i] && str2[i]) - 即使如此,当字符串长度不同时仍存在逻辑错误。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接