scanf(%s)不允许空间?C编程



可能重复:
如何允许使用scanf输入空格?

char inputStr[64];
int inputInt;
printf("Enter a number:");
scanf("%d",&inputInt);
printf("nEnter a string:");
scanf("%s",&inputStr);

上面的代码由两部分组成,读取一个整数和字符串。

读取整数是可以的。

考虑到字符小于64并且没有空格,读取字符串也很好。

这就是问题所在。

scanf只读取一个空格以内的字符。

空间消失后的一切。

如何将空间也包含在scanf中?

与其使用scanf("%s", ...),不如使用:

fgets(inputStr, 64, stdin)

这是一种更好的做法,因为它不容易利用缓冲区溢出,而且它会读取整行输入,这似乎是你正在尝试的。请注意,当使用fgets时,换行符n也会读取到缓冲区中(假设整行都能放入缓冲区(。

此外,当将数组传递给函数时,就像第二次scanf调用一样,不需要使用运算符(&(的地址。数组的名称(即inputStr(是数组开头的地址。

如果您想读取一行,请改用fgets(gets不安全(。

fgets(inputStr, 64, stdin)

如果你想继续使用scanf(例如,如果这个字符串只是你用scanf读取的一些输入(,你可以考虑使用"scanset"转换,例如:

scanf("%63[^n]%*c", inputStr);

fgets不同,这不会在读取后在字符串中包含尾随的新行。还要注意,在扫描集转换中,您指定要读取的字符串的最大长度,而不是缓冲区大小,因此需要指定一个小于缓冲区大小的字符串,以便为终止NUL留出空间。

我已经包含了要读取的"%*c",但放弃了新行。新行被视为空白,在scanf转换字符串中会对其进行特殊处理。正常字符只会匹配并忽略输入中的该字符,但空白匹配并忽略所有连续空白。这在交互式输入中尤其令人讨厌,因为这意味着在您输入其他空白之前,空白转换不会完成匹配。

耶稣有答案——切换到fgets(3);如果您好奇为什么不能用scanf(3):捕获空白

   s      Matches a sequence of non-white-space characters; the
          next pointer must be a pointer to character array that
          is long enough to hold the input sequence and the
          terminating null character (''), which is added
          automatically.  The input string stops at white space
          or at the maximum field width, whichever occurs first.

最新更新