繁体   English   中英

c中的Strcmp一维数组与二维数组

[英]Strcmp 1-D array vs 2-D array in c

当使用 strcmp 函数(在 string.h 库中),传递一个二维字符数组作为参数比较时,需要添加与符号,如

&mainlist[i][0]

否则喜欢

mainlist[i][0]

有一个错误

警告:传递 'strcmp' 的参数 1 使指针从整数而不进行强制转换 [-Wint-conversion]

与传递一维字符数组作为参数比较时,它就足够了

mainlist[i]

没有 & 符号。 怎么来的?

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

#define FOUND 1
#define NOT 0

int main()
{
   char mainlist[5][10] = {"test1", "test2", "test3", "test4", "test5"};
   int flag, i;
   flag = NOT;
   char myname[50];
   printf("Enter ur name.\n");
   scanf("%s", myname);
   for(i = 0; i < 5; i++)
   {
      if(strcmp(mainlist[i], myname)== 0) //vs if(strcmp(&mainlist[i][0]), myname)==0)
      {
         flag = FOUND;
         printf("Your name was found welcome.\n");
         break;
        
      }
   }
   if(flag == NOT)
   {
      printf("Your name was not found .\n");
   }
}

当使用 strcmp 函数(在 string.h 库中),传递一个二维字符数组作为参数比较时,需要添加与符号,如: &mainlist[i][0]

mainlist[i][0]不是二维数组,它是字符串的第一个字符:a char &mainlist[i][0]采用指向该char的指针,即char * 这只是说mainlist[i]的一种复杂方式。

每个数组索引都会取消引用。 mainlist是一个char ** mainlist[i]是一个char *并且mainlist[i][j]是一个char


char mainlist[5][10] = {"test1", "test2", "test3", "test4", "test5"};

记忆中是这样的。

          1         2         3         4
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
^
|
mainlist

其中_表示一个空字节。 mainlist指向包含第一个字符的内存。

当您要求mainlist[i]表示将i * 10添加到mainlist的地址并取消引用它时。 你可以直接写*mainlist + i * 10

          mainlist[1]         mainlist[3]
          |                   |
          v                   v
          1         2         3         4
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
^                   ^                   ^
|                   |                   |
mainlist[0]         mainlist[2]         mainlist[4]

指向字符串第一个字符的指针就是 C 中的字符串,即char * 每一个都是一个字符串,一个一维数组,适合传递给strcmp

mainlist[i][0]表示获取mainlist[i]的地址,添加 0,然后取消引用它。 结果是一个chart 这不适用于strcmp ,因为它需要一个指针。 “警告:传递 'strcmp' 的参数 1 使指针在没有强制转换 [-Wint-conversion] 的情况下从整数生成指针”中的整数是char ,因为字符只是整数,而strcmp试图使用该整数作为char指针。

&mainlist[i][0]表示要创建一个指向该char的指针,所以我们回到char *mainlist[i]

示范

mainlist[i]几乎总是优于&mainlist[i][0] 然而,它确实有它的用途。 有时您想跳过字符串的前几个字符,您可以在不复制或修改字符串的情况下这样做。 例如, &mainlist[2][2]"st3" 它是一个指向mainlist[2] + 2 的指针。

                      &mainlist[2][2]
                      |
                      v
01234567890123456789012345678901234567890123456789
test1_____test2_____test3_____test4_____test5_____
                    ^
                    |
                    mainlist[2]

C 将从指针读取直到空字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM