我从stdinput通过readline()a la:
接收一个字符串char * cmdLine = readline();
然后我想看看通过readline()生成的字符串的第一个字符是否是感叹号。但代码
if(cmdLine[0]=="!")
并不像我想象的那样对我这样做。我认为,如果从stdin中获取的字符串是“!1”,那么
就是这样cmdLine[0]=="!"
如果cmdLine是指向字符串的指针,那么我不能用数组括号查看字符串中的每个字符吗?我知道这是一个愚蠢的基本c /指针问题,但这真的让我感到沮丧......
答案 0 :(得分:8)
将"!"
更改为'!'
。您正在将单个字符与另一个字符进行比较。
在C中,您可以指定带单引号的字符
答案 1 :(得分:4)
你有两个错误:
第一个(不太重要)是你将char与指针进行比较。 element11的答案解决了这一点。
第二个(更重要的)错误是构建过程的警告级别太低。修复更重要的是,因为它不仅可以帮助您找到错误#1,还可能还有很多其他错误。
如何做到这一点取决于您的编译器。使用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点中得到解决),但您将无法获得预期的结果。