我想根据用户的输入执行一个语句:
#include <stdio.h>
#include <string.h>
void main() {
char string_input[40];
int i;
printf("Enter data ==> ");
scanf("%s", string_input);
if (string_input[0] == '\n') {
printf("ERROR - no data\n");
}
else if (strlen(string_input) > 40) {
printf("Hex equivalent is ");
}
else {
printf("Hex equivalent is ");
}
}
当我运行它,然后按回车键时,它会转到一个新行,而不是说“错误 - 没有数据”。
我该怎么办?
不能使用FGETS因为我们没有在课堂上讨论这个问题。
答案 0 :(得分:1)
使用fgets
代替scanf
。 scanf
不检查用户是否在上面的示例中输入了超过40个字符的字符串,因此对于您的特定情况fgets
应该更简单(更安全)。
答案 1 :(得分:1)
你可以使用while循环和getch,然后在每次击键时测试<Enter>
键吗?
答案 2 :(得分:1)
使用
char enter[1];
int chk = scanf("%39[^\n]%c", string_input, enter);
但string_input
内部不会有'\n'
。你的考试
if (string_input[0] == '\n') {
printf("ERROR - no data\n");
}
必须更改为,例如
if (chk != 2) {
printf("ERROR - bad data\n");
}
答案 3 :(得分:0)
scanf
在看到除空白之外的其他内容之前不会返回。它也不区分换行符和其他空格。在实践中,使用scanf
几乎总是一个错误;我建议您拨打fgets
,然后(如果需要)在结果数据上使用sscanf
。
如果你这样做,你真的应该处理用户输入比传递给fgets
的缓冲区更长的行的可能性;你可以知道这是什么时候发生的,因为你的整个缓冲区都被填满了,最后一个字符不是换行符。在这种情况下,您应该重新分配一个较大的缓冲区并再次fgets
到它的末尾,并重复直到您看到换行符或缓冲区变得过大。
在调用scanf
或sscanf
时,您应该同样小心 - 如果用户输入长度为100个字符的字符串会怎么样? (您可以告诉scanf
或sscanf
只接受有限长度的字符串。)
另一方面,如果这只是一个玩具程序,你可以让你的缓冲区合理地长,并希望用户不会做任何讨厌的事情。
答案 4 :(得分:0)
fgets
做你需要的。避免使用scanf
或gets
。如果您无法使用fgets
尝试使用getchar
答案 5 :(得分:0)
问题是"%s"
尝试跳过空格,然后读取字符串 - 根据scanf
,新行是“空白”。
显而易见的替代方法是使用"%c"
代替"%s"
。两者之间的区别在于"%c"
不尝试跳过前导空格。
使用"%[^\n]%*[\n]"
的一个不那么明显(或者不太知道,无论如何)的替代方案。这会读取数据直到遇到换行符,然后读取换行符并不将其分配给任何内容。
无论您使用哪种转换,您都希望(确实需要)限制输入的输入量,这样它就不会溢出您提供的缓冲区,因此您需要使用"%39c"
或"%39[^\n]"
。请注意,当您指定scanf
的长度时,需要减去一个以留出NUL终结符的空间(与fgets
相反,为此指定完整的缓冲区大小)。
答案 6 :(得分:0)
你在运行什么平台?
当您实际按下ENTER键'\n'
时是否发送了字符,或者可能是'\r'
?或者甚至一个接一个(即"\r\n"
)。