【问题标题】:comparison between the string and pointer [duplicate]字符串和指针之间的比较[重复]
【发布时间】:2021-09-14 13:47:18
【问题描述】:

我正在尝试以下代码,但得到了意想不到的结果。

//the first element in argv[] is a
int main(int argc, char *argv[]) {
    char a;
    
    if (*argv ==  "a")
    {
        printf("a");
    }
    
}

执行后我什么也没得到,这意味着条件*argv++ == "a" 为假。那为什么呢?

【问题讨论】:

  • C 不允许将数组内容与“==”进行比较。您必须遍历数组并比较每个元素。
  • 有一个库函数strcmp() 会为你做这件事。 if(strcmp(argv[1], "a") == 0)
  • c中不能比较字符串,必须使用strcmp比较两个字符串。

标签: c command-line-arguments c-strings string-comparison


【解决方案1】:

char *argv[] 是一个指向 char 的指针数组。

    // myapp.c - program to print out all command line parameters
    #include <stdio.h>

    int main (int argc, char *argv[]) {
        int i ;
        for (i = 0; i < argc; i++) {
            printf ("arg %d = %s\n", i + 1, argv[i]) ;
        }
        return 0 ;
    }

如果要编译这段代码并像这样在命令行中运行它:

myapp This That another

它会打印出来

arg 1 = myapp
arg 2 = This
arg 3 = That
arg 4 = another

因此,假设 *argv 指向 0x0800001000(在 RAM 中),而“a”保存在地址 0x090000000(在 RAM 中)。你在做什么就像在说:

if (0x0800001000 == 0x090000000) {
...
}

这总是假的(除非发生了非常奇怪的事情)

我不完全确定你想做什么,但有两种可能性

  1. 您希望将命令行中传入的第一个字符串与“a”进行比较
// do it like this
if (strcmp(argv[1],"a") == 0) {
...
}
  1. 您想将命令行传入的第一个字符串的第一个字符与“a”进行比较
// do it like this
if (argv[1][0] == 'a') {
...
}

我们使用 argv[1] 因为 argv[0] 只是可执行文件的名称

【讨论】:

  • 但是为什么"a" == "a"的说法是真的,他们不是来自不同的地址?
  • 好吧,我已经测试过了,它们确实来自同一个地址
  • 你的编译器很聪明,正在优化字符串存储
  • @oo 不能保证“a”和第二个“a”在同一个地址。
【解决方案2】:

在这个if语句中

if (*argv ==  "a")

比较两个指针。第一个是指针*argv指向的字符串的第一个字符的指针,第二个是字符串字面量"a"的第一个字符的指针。

由于这两个字符串占用不同的内存范围,因此指针的比较总是评估为逻辑假。

如果要比较带指针的字符串,则需要使用标准 C 字符串函数strcmp。例如

if ( strcmp( *argv, "a" ) == 0 )

如果你想比较字符串的第一个字符,那么你应该写

if ( **argv ==  *"a" )

或者只是使用字符'a'而不是更自然的字符串文字

if ( **argv ==  'a' )

注意,如果*argv不等于NULL,那么这个指针指向的是表示正在运行的程序的字符串。

也许你的意思实际上是下面的 if 语句

if ( argc > 1 && strcmp( argv[1], "a" ) == 0 ) 

如果你想检查第一个命令行参数是否等于字符串文字"a"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2012-04-18
    相关资源
    最近更新 更多