[[c]]
int main(){
int a;
scanf("%d", &a);
return 0;
}
在这样一段示例代码之中,如果我们刚开始就输入字符是会报错的,因为scanf %d只会跳过第一个数字前面的空格与换行符等等,而不会跳过字符。 scanf会返回一个数字,这个数字所代表的意思是他读取到的参数个数,比如说在这里那么他读取到的参数个数应该为0。
如果是
scanf("%s", &str);
- 那么这里将会==先跳过开头的所有空格字符==
- 然后进行读取,如果遇到空格或者换行符则结束读取并在字符串的最后添加一个
'\0' - ==读取结束后的
\n==仍然会停留在缓冲区中,下一次读取仍然可以读取到。
关于puts与fputs
- puts会自动添加换行符, fputs不会
关于gets与fgets
关于 fgets 和 gets 是否会在字符串结尾自动添加换行符的问题,以下是详细的解释:
1. fgets ==如果设定字数上限为n,那么只能读进n-1个字符!!==
行为:
- ==开头的空格将会被无差别读取==
fgets会从输入流中读取一行字符串,直到遇到换行符(\n)或达到指定的最大字符数。- 如果读取到换行符(
\n),fgets会将换行符保留在字符串中。 - 无论是否读取到换行符,
fgets都会在字符串末尾自动添加空字符(\0)。
示例:
char buffer[100];
fgets(buffer, sizeof(buffer), stdin);
如果输入是 Hello\n,那么 buffer 的内容将是:
Hello\n\0
2. gets
行为:
gets会从标准输入中读取一行字符串,直到遇到换行符(\n)。- 如果读取到换行符(
\n),gets会==丢弃换行符==,不会将其保留在字符串中。 gets会在字符串末尾自动添加空字符(\0)。
示例:
char buffer[100];
gets(buffer); // 不推荐使用
如果输入是 Hello\n,那么 buffer 的内容将是:
Hello\0
对比总结
| 函数 | 是否保留换行符 | 是否自动添加 \0 |
|---|---|---|
fgets |
是 | 是 |
gets |
否 | 是 |
注意事项
fgets的换行符处理:-
如果你不希望字符串中包含换行符,可以在使用
fgets后手动移除换行符。例如:c char buffer[100]; fgets(buffer, sizeof(buffer), stdin); // 移除换行符 size_t len = strlen(buffer); if (len > 0 && buffer[len - 1] == '\n') { buffer[len - 1] = '\0'; } -
gets的安全性问题: gets不会检查缓冲区的大小,如果输入的数据长度超过缓冲区的大小,会导致缓冲区溢出,这是一个严重的安全隐患。因此,gets在C11标准中已被移除,建议始终使用fgets替代。
总结
fgets会保留换行符,并在字符串末尾添加\0。gets会丢弃换行符,并在字符串末尾添加\0。- 出于安全性考虑,建议始终使用
fgets而不是gets。