【问题标题】:compare 2 char arrays in c比较c中的2个char数组
【发布时间】:2015-07-16 16:14:54
【问题描述】:

我有以下字符数组:

filename[256] = "one.txt"; 
shortname[11] = "ONE     TXT";

在 c 中比较这两个数组的最佳方法是什么?

short name 的前 8 个字符必须与filename. 之前的字符匹配。

我的情况是上述情况有效。

【问题讨论】:

  • 短名称的规则有点复杂。只需使用GetShortPathName() 并与结果进行比较...
  • @simdlx 我是否正确理解这意味着文件名的初始字符必须与短名称一致?
  • 您的第二个数组太短并且不是 C 字符串。将其与字符串函数一起使用时,您正在调用 undefined behavior 。最好避免的是省略数组长度(使用[])。

标签: c filesystems fat


【解决方案1】:

我不知道比较字符串的最佳方法,但一种简单的方法可以如下所示

#include <stdio.h>
#include <ctype.h>

int main( void )
{
    char filename[256] = "one.txt"; 
    char shortname[11] = "ONE     TXT"; 

    char *p = filename;
    char *q = shortname;
    size_t i = 0;
    while ( i < 8 && ( char )toupper( ( unsigned char )*p ) == *q ) ++i, ++p, ++q;

    if ( *q == ' ' || i == 8 ) puts( "They coincide" );
}

程序输出是

They coincide

即程序检查文件名的首字母是否与短名一致。 filname 中的点之前的字符可以多于 shortname 中的字符。 否则可以添加条件*p == '.'

【讨论】:

  • 感谢您的快速答复。我正在为基于 UNIX 的操作系统开发内核驱动程序。在这个级别上,我没有像 toupper() 这样的库和函数。有什么替代的想法吗?可能是映射表?
  • @simdlx 我不知道内核中存在什么以及不存在什么。如果内核没有类似的表,您应该创建自己的表。
【解决方案2】:

我不太清楚你需要什么,所以我给你我理解的:

#include<stdio.h>
#include<string.h>

int main(void){
    char filename[256] = "one.txt";
    char shortname[11] = "ONE     TXT";
    size_t lenght = strlen(filename);
    unsigned int i;

    while(shortname[i]|=' ', shortname[++i]) {
    ;
    }

    for(i=0;i<lenght;i++){
        if(filename[i] == shortname[i]){
            printf("%c",filename[i]);
        }else{
            break;
        }
    }
    printf("\n");
    return 0;
}

输出:

一个

【讨论】:

  • 感谢您的回答。这里发生了什么:while(shortname[i]|=' ', shortname[++i]) { ; } ?我不明白这一行。
  • 它将转换为降低您的 SecondString....char shortname[11] = "ONE TXT";将是 char shortname[11] = "one txt";.试试这个: printf("%s",shortname); while(shortname[i]|=' ', shortname[++i]) 之后
【解决方案3】:

感谢您的回答。我就是这样做的。此代码在循环中运行,检查 FAT 目录中的 32 字节块以查找匹配的目录条目:

   int extensionPos=0;
   int extensionCounter = 0; 
   int j;
   int fnf=0; //file not found marker
   int hasExtension=0; 

   //Check if filename has an extension and remember the position
   for (i=0;i<11;i++){
      if (filename[i] == '.'){
         break;
       }else{
         extensionPos++;
       }
   }

   //Is position < 11? filename has an extension
   if (extensionPos<11)
      hasExtension=1; 

   for (j=1;j<extensionCounter;j++){
       if (FAT_DirEntry->DIR_shortName[j] != filename[j]){
           fnf=1;     
           break;
       }
    }

    if (hasExtension == 1){//Do only check extension if filename has one
        extensionCounter +=1; // extensionCounter +1 because I don't want to work with the '.' 
        for (j=8;j<11;j++){ 
            if (FAT_DirEntry->DIR_shortName[j] != filename[extensionCounter]){
                    fnf=1; 
                    break;
             }
             extensionCounter++;
        }

    }   
    if (fnf == 0){
        ... 
    }

【讨论】:

    【解决方案4】:

    使用两个索引,每个字符串一个,逐个字符比较(忽略大小写)并跳过空格和点。

    【讨论】:

    • 我不是反对者,但你的想法似乎很有潜力。将其编码并发布代码。因为有太多的误解空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多