如果用户什么都没输入,我该如何返回printf语句?

时间:2011-04-11 13:49:52

标签: c

我想根据用户的输入执行一个语句:

#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因为我们没有在课堂上讨论这个问题。

7 个答案:

答案 0 :(得分:1)

使用fgets代替scanfscanf不检查用户是否在上面的示例中输入了超过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到它的末尾,并重复直到您看到换行符或缓冲区变得过大。

在调用scanfsscanf时,您应该同样小心 - 如果用户输入长度为100个字符的字符串会怎么样? (您可以告诉scanfsscanf只接受有限长度的字符串。)

另一方面,如果这只是一个玩具程序,你可以让你的缓冲区合理地长,并希望用户不会做任何讨厌的事情。

答案 4 :(得分:0)

fgets做你需要的。避免使用scanfgets。如果您无法使用fgets尝试使用getchar

答案 5 :(得分:0)

问题是"%s"尝试跳过空格,然后读取字符串 - 根据scanf,新行是“空白”。

显而易见的替代方法是使用"%c"代替"%s"。两者之间的区别在于"%c" 尝试跳过前导空格。

使用"%[^\n]%*[\n]"的一个不那么明显(或者不太知道,无论如何)的替代方案。这会读取数据直到遇到换行符,然后读取换行符并不将其分配给任何内容。

无论您使用哪种转换,您都希望(确实需要)限制输入的输入量,这样它就不会溢出您提供的缓冲区,因此您需要使用"%39c""%39[^\n]"。请注意,当您指定scanf的长度时,需要减去一个以留出NUL终结符的空间(与fgets相反,为此指定完整的缓冲区大小)。

答案 6 :(得分:0)

你在运行什么平台?

当您实际按下ENTER键'\n'时是否发送了字符,或者可能是'\r'?或者甚至一个接一个(即"\r\n")。