Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中使用printf和scanf_C_Printf_Scanf - Fatal编程技术网

在循环中使用printf和scanf

在循环中使用printf和scanf,c,printf,scanf,C,Printf,Scanf,在这段代码中,我只想打印一个命令提示符。当用户输入某些内容时,不会发生任何事情,并且再次打印命令提示。但是scanf运行一次,然后$$$>以循环方式打印。 当我尝试使用字符数组而不是str指针时,代码会运行。 为什么? char*str 您使用str时没有初始化它。在另一个函数(如scanf)中使用未初始化的指针会导致程序崩溃 您可以通过malloc动态分配str指针来解决这个问题,但是对于这种简单的用法,您可以使用array代替 char *str; while(1) { printf

在这段代码中,我只想打印一个命令提示符。当用户输入某些内容时,不会发生任何事情,并且再次打印命令提示。但是scanf运行一次,然后$$$>以循环方式打印。 当我尝试使用字符数组而不是str指针时,代码会运行。 为什么?

char*str

您使用str时没有初始化它。在另一个函数(如scanf)中使用未初始化的指针会导致程序崩溃

您可以通过malloc动态分配str指针来解决这个问题,但是对于这种简单的用法,您可以使用array代替

char *str;
while(1)
{
    printf("$$$$>");
    scanf("%s",str);
}

由于您没有分配str可以指向的内存缓冲区,请在str decleration下面添加此行:

char str[100] = "";
while(1)
{
    printf("$$$$>");
    // scanf("%s",str);  // not recommended
    fgets( str, sizeof( str ), stdin );  // fgets is better
}

声明指针后,必须将内存分配给字符串。可以通过使用malloc或calloc函数来实现

str=malloc(sizeof(char)*1000);


sizeofchar始终为1,因此它不会为代码添加值。如果想匹配str的类型,只需使用str=mallocsizeof*str*1000;你错了。。。字符的大小实际上是1,这是为了代码的可读性。。。str是一个地址,所以您只分配了1000*个地址值,可以是百万字节。。。而且你不需要匹配任何类型。。。你显然不知道c..Hmmm显然不知道c->See and and and str是一个地址,所以你只分配了1000个*地址值->否,分配了1000倍于取消引用的str的类型,在本例中,大小为*str*1000->1*1000,不可能是每个用户的数百万字节。建议使用printf%zu\n,sizeof*str*1000进行测试;我断言str=mallocsizeof*str*1000;比str=mallocsizeofchar*1000更容易编码,不太可能出错,更容易检查和维护我有30多年的C语言经验。与其和你一起评论评论者,显然你不了解C和snides,我非常清楚,还有很多糟糕的编程者,最好专注于评论/帖子/答案本身。这是专业的,本网站有政策。@chux同意,更改了ans的感谢。但我还有一个疑问。与char str[100]=的区别是什么;和char-str[100];两者的输出相同,尽管]@ravindrakonga str[100]=;确保字符串初始化为空,即在执行任何操作之前,所有字符都设置为0。在使用前初始化变量是一个很好的做法。char*str;str=char*mallocsizeofchar*100;fgets str、sizeof str、stdin;printf%s,str;当我运行这段代码时,即使输入量很大,也只会打印7个字符。你能告诉我原因吗?那是因为你使用str作为指针;在您的机器中,sizeof str只有8个字符,因此您只能输入7个字符。str的sizeof可以像我声明str为数组一样工作。如果您坚持使用指针,那么您必须自己提供100,而不是使用sizeofchar*str;str=char*mallocsizeofchar*100;fgets str、sizeof str、stdin;printf%s,str;当我运行此代码时,即使输入量很大,也只会打印7个字符。你能告诉我原因吗?我以前使用过fgets,但它对我来说不太好!我建议使用fscanf而不是fgets。你可以这样写fscanfstdin,%s,str;
char *str = (char*) malloc(sizeof(char) * 100);
char *str = (char*) calloc(100, sizeof(char));