Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
C 获取用户输入(按enter键终止)_C - Fatal编程技术网

C 获取用户输入(按enter键终止)

C 获取用户输入(按enter键终止),c,C,我使用scanf获取用户输入,但如果按enter键,光标将闪烁到下一行~ 如果我想让用户只按enter键而不键入任何东西,程序将终止,我应该使用什么函数来代替scanf 谢谢Scanf一直读到下一个标记——它根本不关心换行符(只认为它们是空格,就像空格或制表符一样) 相反,使用一个行读取函数,比如。Scanf会一直读取到下一个标记——它根本不关心换行符(只考虑它们是空格,比如空格或制表符) 相反,使用一个行读取功能,如。我不同意: char * x; scanf("%s",x); printf(

我使用scanf获取用户输入,但如果按enter键,光标将闪烁到下一行~ 如果我想让用户只按enter键而不键入任何东西,程序将终止,我应该使用什么函数来代替scanf


谢谢

Scanf一直读到下一个标记——它根本不关心换行符(只认为它们是空格,就像空格或制表符一样)


相反,使用一个行读取函数,比如。

Scanf会一直读取到下一个标记——它根本不关心换行符(只考虑它们是空格,比如空格或制表符)

相反,使用一个行读取功能,如。

我不同意:

char * x;
scanf("%s",x);
printf("Inserted line: %s\n",x);
在返回键之前,将只在x中存储字符。 我构建并运行了它,它就运行了。

我不同意:

char * x;
scanf("%s",x);
printf("Inserted line: %s\n",x);
在返回键之前,将只在x中存储字符。 我构建并运行了它,它就工作了。

只需使用以下代码:

char ch;
printf("Enter Your Sentence \n");
while (1) 
{ 
     ch = getch();
     if ((int)ch == 13) 
         break;
     printf("%c", ch);
}
只需使用以下代码:

char ch;
printf("Enter Your Sentence \n");
while (1) 
{ 
     ch = getch();
     if ((int)ch == 13) 
         break;
     printf("%c", ch);
}
可以通过以下方式使用get()函数:

#include <stdio.h>
#define MAX_INPUT_CHAR 100
int main( ) {

   char str[MAX_INPUT_CHAR ];

   printf( "Enter a value :");
   gets( str );   

   return 0;
}
#包括
#定义最大输入字符100
int main(){
字符str[MAX_INPUT_char];
printf(“输入值:”);
获取(str);
返回0;
}
函数char*获取(char*s)将stdin中的一行读取到 直到终止换行符或EOF(文件结束)

注意,这是不安全的。你现在无法预知它将读取多少字符。这可能会导致一些安全问题并最终崩溃。

您可以通过以下方式使用get()函数:

#include <stdio.h>
#define MAX_INPUT_CHAR 100
int main( ) {

   char str[MAX_INPUT_CHAR ];

   printf( "Enter a value :");
   gets( str );   

   return 0;
}
#包括
#定义最大输入字符100
int main(){
字符str[MAX_INPUT_char];
printf(“输入值:”);
获取(str);
返回0;
}
函数char*获取(char*s)将stdin中的一行读取到 直到终止换行符或EOF(文件结束)


注意,这是不安全的。你现在无法预知它将读取多少字符。这可能会导致一些安全问题并最终崩溃。

嗯,这给了我一个分段错误。首先,传递到
scanf
的指针需要初始化为指向某个地方,否则scanf将尝试写入随机内存单元并使程序崩溃。第二,永远不要使用
scanf(“%s”,…)
。如果您确实初始化了
x
,您会分配多少字节?您不可能知道用户将提供多少字节,因此他们总是可以使用它来崩溃您的程序,或者更糟。最后,scanf直到返回键时才获取字符,它获取第一个单词。如果第一行没有单词,它将在下一行等待。不,它没有。我跑了。第二点:我们讨论的不是内存管理,而是如何获取字符串。所以没有必要教我如何安全地处理记忆<代码>#include int main(int argc,char*argv[]){int a;char*x;scanf(“%s”,x”);printf(“插入行:%s\n,x”);scanf(“%d”,&a);return 0;}尝试构建一个运行它的程序。我不知道该告诉你什么,伙计。。。当你键入一个单词并点击return时,这个程序就会崩溃(如果你不键入一个单词,它会一直等到你键入为止……这就是问题中提出的问题)。它不可能不崩溃,因为您要求scanf写入
x
,但尚未为其分配任何内存。处理字符串确实需要以安全的方式处理内存。我保证任何使用
scanf(“%s”,…)
的程序都容易受到缓冲区溢出的攻击,这意味着攻击者可以接管计算机。这是一个非常危险的安全漏洞。我一直在试图弄清楚它是如何为您“工作”的。你有机会使用DOS吗?在DOS或类似的旧操作系统(也包括Mac OS 9)中,没有分段错误,只有内存损坏。在这种情况下,它可以正常工作而不会崩溃,但它仍然非常糟糕——它可能会随机写入部分操作系统或其他程序,例如。嗯,这给了我一个分段错误。首先,传递到
scanf
的指针需要初始化为指向某个地方,否则scanf将尝试写入随机内存单元并使程序崩溃。第二,永远不要使用
scanf(“%s”,…)
。如果您确实初始化了
x
,您会分配多少字节?您不可能知道用户将提供多少字节,因此他们总是可以使用它来崩溃您的程序,或者更糟。最后,scanf直到返回键时才获取字符,它获取第一个单词。如果第一行没有单词,它将在下一行等待。不,它没有。我跑了。第二点:我们讨论的不是内存管理,而是如何获取字符串。所以没有必要教我如何安全地处理记忆<代码>#include int main(int argc,char*argv[]){int a;char*x;scanf(“%s”,x”);printf(“插入行:%s\n,x”);scanf(“%d”,&a);return 0;}尝试构建一个运行它的程序。我不知道该告诉你什么,伙计。。。当你键入一个单词并点击return时,这个程序就会崩溃(如果你不键入一个单词,它会一直等到你键入为止……这就是问题中提出的问题)。它不可能不崩溃,因为您要求scanf写入
x
,但尚未为其分配任何内存。处理字符串确实需要以安全的方式处理内存。我保证任何使用
scanf(“%s”,…)
的程序都容易受到缓冲区溢出的攻击,这意味着攻击者可以接管计算机。这是一个非常危险的安全漏洞。我一直在试图弄清楚它是如何为您“工作”的。你有机会使用DOS吗?在DOS或类似的旧操作系统(也包括Mac OS 9)中,没有分段错误,只有内存损坏。在这种情况下,它可以在不崩溃的情况下工作,但仍然非常糟糕——它可以随机写入部分运算符