扫描c语言的澄清

  • 本文关键字:语言 扫描 c
  • 更新时间 :
  • 英文 :


是否可以读取包含空格的整个字符串,如scanf()中的gets()函数?

我可以使用gets()函数来完成。

char s[30];
gets(s);

这将读取一行字符。这可以在scanf()中完成吗?

您可以使用scanf()读取一行,包括空格,但此函数很微妙,使用它很容易出错。使用%[^n]转换说明符,可以告诉scanf()匹配字符以形成字符串,不包括'n'字符。如果执行此操作,则应指定最大字段宽度。此宽度指定要匹配的最大字符数,因此必须为''终止符留出空间。

输入流中的第一个字符可能是CCD_ 10。在这种情况下,scanf()将返回值0,因为在遇到换行符之前没有匹配项。但是,s中不会存储任何内容,因此您可能有未定义的行为。为了避免这种情况,可以先使用%*[n]转换说明符调用scanf(),丢弃任何前导'n'字符。

在读取字符串之后,输入流中将有额外的字符。至少存在一个'n',如果用户输入的字符超过指定的最大字段宽度,则可能存在更多字符。然后,您可能需要丢弃这些额外的字符,这样它们就不会干扰进一步的输入。下面的代码包括一个执行此操作的循环。

scanf()的第一次调用将消耗输入流中的所有换行符,直到遇到非换行符为止。虽然我认为对scanf()的第二次调用应该总是成功的,但最好始终检查scanf()的返回值(即成功分配的次数)。我已将此值存储在result中,并在打印字符串之前对其进行检查。如果scanf()返回意外结果,则会打印一条错误消息。

使用fgets()读取整行内容更好、更容易。您必须记住,fgets()保留了尾部换行符,因此您可能需要将其删除。还有一种可能性是,用户输入的字符数将超过缓冲区存储的字符数,从而将剩余字符留在输入流中。在提示输入更多信息之前,您可能需要删除这些多余的字符。

同样,您应该检查fgets()的返回值;此函数返回指向存储缓冲区的第一个元素的指针,或者在发生错误时返回NULL指针。下面的代码将替换字符串中任何尾随的换行符,丢弃输入流中的额外字符,并且仅当对fgets()的调用成功时才打印字符串。否则,将打印一条错误消息。

#include <stdio.h>
int main(void)
{
char s[30];
int result;
printf("Please enter a line of input:n");
scanf("%*[n]");                // throw away leading 'n' if present
result = scanf("%29[^n]", s);  // match up to 29 characters, excluding 'n'
/* Clear extra characters from input stream */
int c;
while ((c = getchar()) != 'n' && c != EOF)
continue;                   // discard extra characters
if (result == 1) {
puts(s);
} else {
fprintf(stderr, "EOF reached or error in scanf()n");
}
printf("Please enter a line of input:n");    
char *ps = fgets(s, 30, stdin); // keeps 'n' character
if (ps) {
while (*ps && *ps != 'n') {
++ps;
}
if (*ps) {                  // replace 'n' with ''
*ps = '';
} else {
while ((c = getchar()) != 'n' && c != EOF)
continue;           // discard extra characters
}
puts(s);
} else {
fprintf(stderr, "EOF reached or error in fgets()n");
}
return 0;
}

请注意,这两种获取输入行的方法并不完全等效。这里所写的scanf()方法不接受空行(即,仅由'n'字符组成的行),但接受由其他空白字符组成的行将。fscanf()方法将接受一个空行作为输入。

此外,如果忽略前导空白字符是可以接受的,那么按照Jonathan Leffler在评论中给出的建议,只使用对scanf():的单个调用会更简单

result = scanf(" %29[^n]", s);

这将忽略前导空白字符,包括换行符。

不要使用scanf()gets()函数,而是使用fgets()。但对于以上问题,请找到答案。

int main() {
char a[30];
scanf ("%29[^n]%*c", name);
printf("%sn", a);
return 0;
}

它也强烈建议使用fgets(),就像我一开始告诉的那样。我们显然不理解这种奇怪的要求。我会用fgets()来读这个字符。

fgets(a, size(a), stdin);

最新更新