关于C语法的几个问题

时间:2011-10-19 18:57:35

标签: c syntax

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

  1. ch = (char *) malloc( sizeof( char ) * strlen(src) ); 第一个括号是什么意思(char *)?

  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
    

8 个答案:

答案 0 :(得分:10)

其他人已经正确回答了前两个问题,所以我将回答你的第三个问题:

当您输入character并按ENTER键时,输入缓冲区中会放置两个字符characternewline字符。

您需要考虑这两个因素。因此,首先scanf使用换行符,另一个读取该字符。

分步代码分析:

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

使用上述两个语句,您会看到Enter the string并且程序会等待您的输入。 我们假设您输入字符C并按Enter键一次。执行此操作时,输入缓冲区将接收两个字符:

  1. 您输入的字符C&
  2. 换行符\n
  3. scanf语句只从输入缓冲区中读取一个字符(C)。因此,newline字符在输入缓冲区中仍未读取。

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

    通过以上两个语句,显示enter charscanf只是跳过(不等待任何输入),这是因为读取了输入缓冲区中未读的newline字符通过这个scanf

    因此,为了适当地接收下一个输入字符,您需要额外的scanf

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

答案 1 :(得分: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*混淆,后者是'1'类型的字符串文字,指向包含两个字符的内存块的指针,\0后跟{{1 }}


关于问题3,我不清楚你的意思,在任何情况下,我都会按照时间规则调用一个问题来证明不解决它!其他人已经为你回答了这个问题。

答案 2 :(得分:4)

简单来说:

1)因为malloc返回一个void类型的指针,你将该指针转换为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;
}

答案 3 :(得分:2)

  1. 这是演员;它将malloc(a void*)的返回值视为char*

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

答案 4 :(得分: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?

答案 5 :(得分:1)

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

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

  3. 如果没有示例代码,说scanf有时不起作用是没有意义的声明。

答案 6 :(得分: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转换说明符不会跳过空格(与其他所有转换说明符不同)。

答案 7 :(得分:0)

我想加入@Alok Save的回答。他已经正确地分析了它,但是对于那种情况存在另一个简单的解决方案,那就是使用带有字符串格式的空格的scanf,如下所示:

scanf(" %c", &variable);

这是因为%c不像其他人那样吸收换行符(如%d)。格式字符串中的任何空格都会导致扫描吸收所有连续的空格,从而无需另外的scanf语句。

希望这有帮助!