关于C语法的几个问题

va.*_*va. 1 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
    
    Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 10

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

当您输入character并按Enter键时,输入缓冲区中将放置两个字符character,即newline字符.

您需要考虑这两个因素.因此,First scanf消耗换行符,另一个读取字符.

分步代码分析:

printf("enter string \n");   
scanf("%s",&str);
Run Code Online (Sandbox Code Playgroud)

通过以上两个语句,您可以看到Enter the string并编程等待您的输入.我们假设您输入字符C并按Enter键一次.执行此操作时,输入缓冲区接收两个字符:

  1. C你输入的角色&
  2. 换行符 \n

scanf语句只C从输入newline缓冲区中读取一个字符().因此,该字符在Inuput缓冲区中保持未读状态.

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

使用上面的两个语句,enter char显示但scanf只是跳过(不等待任何输入),这是因为newline输入缓冲区中的未读字符由此读取scanf.

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

scanf("%c",&ch);  //with this second line do scan my char
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 5

ch = (char *) malloc( sizeof( char ) * strlen(src) );
Run Code Online (Sandbox Code Playgroud)

(char*)是一个演员.它表示将返回值malloc视为指针char.但是,这不是必需的,因为void*返回类型的malloc赋值与C中的所有指针变量兼容.

根据定义,更多的sizeof(char)是虚假sizeof(char) == 1的.最后,这种分配几乎肯定会分配一个元素太少.零终结器需要有空间.

所以,它应该写成:

ch = malloc(strlen(src)+1);
Run Code Online (Sandbox Code Playgroud)

至于'1',这是一个char字面意思.它有类型int.

这不是太混淆,"1"哪个是字符串文字,类型char*,指向包含两个字符的内存块的指针,'1'后跟\0.


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

  • 在C中,字符文字的类型为"int". (2认同)