3

参考までに、私が持っている 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', ...}同じですか、それともここで何か不足していますか?

4

3 に答える 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';
于 2013-07-09T23:34:14.863 に答える
1

current_cmd = (unsigned char)'\0'; current_cmd は配列であり、lvable にすることはできません。代わりに current_cmd[0] = '\0' を使用して文字列をリセットできます。

char check[10] = "help";

以下と同じです:

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

しかし

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

文字ではなく文字列の配列を意味するため、間違っています。

于 2013-07-10T03:19:55.753 に答える
1

Heresはあなたのために働く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);
}
于 2013-07-16T07:46:13.480 に答える