我有一些关于C语法的问题。
ch = (char *) malloc( sizeof( char ) * strlen(src) );
第一个括号是什么意思(char *)?
c=getch();
switch(c) {
case '1' :{
我的老师问为什么'这种类型'的引号被使用而不是“双重”。我说如果使用char变量,它是C语法。但他说不!为什么使用单引号而不是双引号?
有时使用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
答案 0 :(得分:10)
其他人已经正确回答了前两个问题,所以我将回答你的第三个问题:
当您输入character
并按ENTER键时,输入缓冲区中会放置两个字符character
和newline
字符。
您需要考虑这两个因素。因此,首先scanf
使用换行符,另一个读取该字符。
分步代码分析:
printf("enter string \n");
scanf("%s",&str);
使用上述两个语句,您会看到Enter the string
并且程序会等待您的输入。
我们假设您输入字符C
并按Enter键一次。执行此操作时,输入缓冲区将接收两个字符:
C
& \n
scanf
语句只从输入缓冲区中读取一个字符(C
)。因此,newline
字符在输入缓冲区中仍未读取。
printf("enter char \n");
scanf("%c",&ch); //does not scan my char
通过以上两个语句,显示enter char
但scanf
只是跳过(不等待任何输入),这是因为读取了输入缓冲区中未读的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)
这是演员;它将malloc
(a void*
)的返回值视为char*
。
这是一个普通的char
字面值。
答案 4 :(得分:2)
在:
char *ch = (char *) malloc( sizeof( char ) * strlen(src) );
第一个(char *)
会将返回值转换为char *
。在C中,这是完全没必要的,can mask failure to #include <stdlib.h>
。
此外,sizeof(char)
始终为1
,因此永远不需要。
最有可能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)
第一个语句开头的(char )是一个类型转换。默认情况下,malloc返回一个void ,它可以很好地分配给char *,但在其他情况下需要进行类型转换。
你应该在字符周围使用正确的单引号。
如果没有示例代码,说scanf有时不起作用是没有意义的声明。
答案 6 :(得分:1)
(char *)
是演员;它表示“将以下值视为指向char
的指针”。在这种特殊情况下,它是多余的,被认为是不好的做法。
'1'是字符常量;在某种程度上非直观地,它具有类型int
(这与C ++不同,其中字符常量是类型char
)。 “1”将是字符串常量,它实际上是类型char [2]
的数组表达式,其内容为{'1', 0}
。
这是因为在前一个输入操作的输入流中留下了换行符。假设你键入“foo”并点击Return;输入流将包含字符'f','o','o','\ n'。第一个scanf
调用读取并将“foo”分配给str
,在输入流中保留尾部'\ n'。下一个scanf
调用正在拾取该杂散换行符,因为%c
转换说明符不会跳过空格(与其他所有转换说明符不同)。
答案 7 :(得分:0)
我想加入@Alok Save的回答。他已经正确地分析了它,但是对于那种情况存在另一个简单的解决方案,那就是使用带有字符串格式的空格的scanf,如下所示:
scanf(" %c", &variable);
这是因为%c不像其他人那样吸收换行符(如%d)。格式字符串中的任何空格都会导致扫描吸收所有连续的空格,从而无需另外的scanf语句。
希望这有帮助!