2011-10-19 82 views
0

我有几个关于C语法的问题。关于C语法的一些问题

  1. ch = (char *) malloc(sizeof(char) * strlen(src)); 什么第一括号表示(字符*)?

  2. c=getch();

    switch(c) {

    case '1' :{

    我的老师问为什么 '这种类型的' 使用了引号,而不是 “双”。我说如果使用char变量,它就是C语法。但他说不!为什么使用单引号而不加倍?

  3. 有时使用scanf什么时候发生,它已被用于两次得到的东西扫描。这个问题的原因是什么? 例如:

    printf("enter string \n"); 
    scanf("%s",&str); 
    printf("enter char \n"); 
    scanf("%c",&ch); //does not scan my char 
    scanf("%c",&ch); //with this second line do scan my char 
    
+1

,能不能请您详细说明你的最后一个问题?或者,如果你能提供一个澄清的例子,那就更好了。 – jweyrich

+0

我认为(这)(http://stackoverflow.com/questions/7802540/while-switch-statement-weird-output/)问题有一个使用情况,并回答你的最后一个问题: –

+0

第三个问题编辑 –

回答

2
  1. 此浇铸;它将malloc(a void*)的返回值视为char*

  2. 这是一个普通的char文字。

+2

这是C.非标准函数'getch'最有可能返回'int'。 http://pubs.opengroup.org/onlinepubs/7908799/xcurses/getch.html –

+4

事实上,'getch'返回'int'。 – jweyrich

5
ch = (char *) malloc(sizeof(char) * strlen(src)); 

(char*)是一个演员。它表示将malloc的返回值作为指向char的指针。然而,这并不是因为void*必要的malloc返回类型是与C.

所有指针变量什么是转让兼容更多的sizeof(char)是因为sizeof(char) == 1定义乱真。最后这个分配几乎可以肯定地分配一个元素太少了。需要有零终结符的空间。

因此,它或许应该这样写:

ch = malloc(strlen(src)+1); 

至于'1',这是一个char文字。它具有类型int

这不是太与"1"这是一个字符串混淆char*类型,一个指针到的含有两个字符,一个内存块随后\0'1'


至于问题3,这是我不明白你的意思,并且在任何情况下,我会调用一个问题,在规则的时间来证明没有解决它!其他人则回答说你。

+2

在C中,字符文字的类型为“int”。 –

+0

@Sinan更正。 –

1
  1. 第一条语句开头的(char )是一个类型转换。默认情况下,malloc返回一个void,它应该可以分配给char *,但在其他情况下需要类型转换。

  2. 你是正确的单引号应该用在字符。

  3. 说出scanf有时不起作用是没有示例代码的毫无意义的陈述。

2

在:

char *ch = (char *) malloc(sizeof(char) * strlen(src)); 

(char *)铸传回值char *。在C中,这完全没有必要,并且can mask failure to #include <stdlib.h>

另外,sizeof(char)总是1,所以从不需要。

字符文字'1' has type int in C

最可能的是getch返回int。字符串文字"1"由两个字符组成。数字1和字符串标记NUL字符的结尾。如果您使用过case "1":,则返回值getch将与指向"1"的指针的值进行比较(在隐式转换为int后)。

至于scanf,输入缓冲区可能包含尚未被程序处理的输入。请参阅Why does everyone say not to use scanf? What should I use instead?

8

其他人已经回答正确侑前两个问题,所以我会回答你的第三个问题:当你进入一个character

,并按下回车键,两个字符放入输入缓冲区,characternewline个性。

你需要考虑这两个。所以第一个scanf消耗换行符,另一个读取字符。

分步代码分析:

printf("enter string \n"); 
scanf("%s",&str); 

通过以上两种说法,你看Enter the string和程序等待您的输入。 让我们假设您输入字符C并按Enter一次。当您执行此操作时,输入缓冲器接收两个大字:

  1. 您输入的字符C &
  2. 换行符\n

scanf的语句从读取一个字符(C)输入缓冲区。因此,newline字符在输入缓冲区中保持未读。

printf("enter char \n"); 
scanf("%c",&ch); //does not scan my char 

通过以上两种说法,enter char被显示,但scanf只是跳过(不等待任何UER输入),这是因为在输入缓冲器中的未读newline字符由该scanf读取。

因此要正确接收下一个输入字符,您需要额外的scanf

scanf("%c",&ch); //with this second line do scan my char 
+0

我很好奇,为什么'scanf'消耗在什么似乎是相反的顺序字符? –

+0

@DavidHeffernan:对不起,我看到这个评论比较晚(时间差异),Apparantely,我的答案是没有解释的,我加一步一个细节步骤,以回答您的查询。 –

1
  1. (char *);它的意思是“将以下值作为指向char的指针”。在这种情况下,这是多余的,被认为是不好的做法。

  2. '1'是字符常量;有点不直观,它的类型为int(这与C++不同,字符常量的类型为char)。 “1”将是字符串常量,它实际上是char [2]类型的数组表达式,其内容为{'1', 0}

  3. 这是因为在上一次输入操作中输入流中留有换行符。假设你输入“foo”并点击Return;输入流将包含字符'f','o','o','\ n'。第一个scanf调用读取并将“foo”分配给str,在输入流中留下尾随的'\ n'。在下一个scanf调用中正在拾取该杂乱的换行符,因为%c转换说明符不会跳过空格(与其他所有转换说明符不同)。

4

简单来说:

1)以来的malloc返回类型的指针空隙,则在铸造该指针char类型的指针,使得可变CH稍后将保持字符数组(一个字符串)

2)单引号主要用于,因为C中的switch语句总是期望INTEGER而不是字符串。具有被单引号包围的字符将返回字符的整数表示。

3)这是使用scanf时的一个常见问题,基本上它是由前一个scanf输入的回车引起的。我建议你在使用之前总是刷新输入。

下面是一个例子:

#include <stdio.h> 

int main (void) 
{ 
    char line[200]; 
    while(1) 
    { 
     printf("\nenter a string: "); 
     fflush(stdout);   // safety flush since no newline in printf above 
     scanf(" %[^\n]",line); // note space character 
     printf("you entered >%s<\n",line); 
    } 
    return 0; 
} 
0

我倒要添加到@Alok保存的答案。他分析了它正确然而,另一种简单的解决方案存在的话,那就是在字符串格式使用scanf的一个空白如下:

scanf(" %c", &variable); 

这是因为%C不吸收换行符别人一样(如%d)。格式字符串中的任何空格将导致扫描吸收所有连续的空格,从而避免需要另一个scanf语句。

希望这会有所帮助!