抓住字符串的第一个字符

时间:2016-08-29 20:18:33

标签: c

我从stdinput通过readline()a la:

接收一个字符串
char * cmdLine = readline();

然后我想看看通过readline()生成的字符串的第一个字符是否是感叹号。但代码

if(cmdLine[0]=="!")

并不像我想象的那样对我这样做。我认为,如果从stdin中获取的字符串是“!1”,那么

就是这样
cmdLine[0]=="!"

如果cmdLine是指向字符串的指针,那么我不能用数组括号查看字符串中的每个字符吗?我知道这是一个愚蠢的基本c /指针问题,但这真的让我感到沮丧......

3 个答案:

答案 0 :(得分:8)

"!"更改为'!'。您正在将单个字符与另一个字符进行比较。

在C中,您可以指定带单引号的字符

答案 1 :(得分:4)

你有两个错误:

  1. 第一个(不太重要)是你将char与指针进行比较。 element11的答案解决了这一点。

  2. 第二个(更重要的)错误是构建过程的警告级别太低。修复更重要的是,因为它不仅可以帮助您找到错误#1,还可能还有很多其他错误。

  3. 如何做到这一点取决于您的编译器。使用gcc时,-Wall -pedantic选项是一个良好的开端:

    $ gcc -Wall -pedantic test.c
    test.c: In function ‘main’:
    test.c:7:16: warning: comparison between pointer and integer
      if (cmdLine[0]=="!") {
                    ^
    test.c:7:16: warning: comparison with string literal results in unspecified behavior [-Waddress]
    

答案 2 :(得分:1)

C中的双引号用于表示字符数组。默认情况下,null字符将附加到双引号内的任何内容。所以

"!" // makes for two characters the '!' and the terminating null character '\0'.

您的意图显然是比较单个字符,单个字符 应该用单引号括起来。所以正确的比较是

if(cmdLine[0]=='!')

cmdLine[0]=="!"会怎样?

正如我的回答的第一部分所说,"!"生成一个空终止的字符数组或一个有效的字符串。此(常量)字符串存储在目标文件的数据段部分中。对"x"的引用为您提供了字符串的起始地址,即您获得了一个指针。因此当你做

 if(cmdLine[0]=='!')

您将整数(假设char是整数类型)与指针进行比较。虽然这可能不会产生错误(这在[ this ]回答的第2点中得到解决),但您将无法获得预期的结果。