2016-08-29 69 views
3

我通过的ReadLine采取在一个字符串从stdinput()一拉的第一个字符:抓住一个字符串

char * cmdLine = readline(); 

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

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

不这样做对我来说就像我会想到的那样。我认为,如果从标准输入陷入僵局字符串为“!1”来说那将是真实的

cmdLine[0]=="!" 

如果CMDLINE是一个指向字符串,则不能看我的字符串中的每个字符与数组括号?我知道这是一个愚蠢的基本C /指针问题,但这真的让我绊倒...

+4

您试图比较整数(CMDLINE [0])的指针(“!”)应该已经创建了一个大胖子的编译器警告。如果没有,请找出如何将警告提高。 –

+0

还有一个问题:你的评论听起来有帮助吗?如果是这样,那么你是一个比有帮助的人更好的程序员... – nbk

+0

是的,它是有帮助的。一旦编译器发出警告,您将很快看到这些问题。这就是编译器*有*警告的原因。 –

回答

8

更改"!"'!'。您正在比较单个字符与另一个字符。在C指定用单引号

+0

谢谢!我很感谢你的回答。 – nbk

+0

@nbk然后公平,并将其标记为公认的答案! –

1

双引号中C

用于表示字符的阵列。默认情况下,空字符将被添加到双引号内的任何内容中。所以

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

你的意图显然是比较单个字符,一个字符 应该用单引号。所以,正确的对比将

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

cmdLine[0]=="!"会发生什么?

作为我的答案的第一部分说,"!"使空终止的字符数组或有效的字符串。该(常量)字符串存储在目标文件的数据段部分。对"x"的引用给出了字符串的起始地址,即你得到一个指针。因此,当你做

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

你比较一个整数(记住,char是一个整数型)的指针。虽然这可能不会产生错误(这在[ this ]答案的第2点中得到了解决),但您不会得到预期的结果。

+1

谢谢!我很感谢你的回答。 – nbk

4

你有两个错误:

  1. 第一个(不那么重要)一个是你一个char比较的指针。 element11的答案解决了这一问题。

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

如何做到这一点取决于您的编译器。当使用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] 
+0

这里有很好的信息。在c中,未定义的行为是你想要的最后一件事。 C通常很乐意继续进行未定义的行为,就好像没有什么不好的事情发生一样。一直给你输出你不指望。让你的编译器抓住这些是件好事。随着程序规模的增长,未定义的行为可能成为一场噩梦。 – element11

相关问题