scanf和gets和getchar和puts的区别
时间: 2023-11-22 09:05:53 浏览: 48
scanf、gets、getchar和puts都是C语言的输入输出函数。
区别如下:
1. scanf是格式化输入函数,可以按照给出的格式从标准输入流中逐一读取数据。gets则是无格式输入函数,会读取整行,包括间隔符,以换行符为结束标志。
2. getchar函数一般用于从标准输入流中读取一个字符,因此不需要给出格式说明符。
3. puts函数将一个字符串(不包括\0)输出到标准输出设备中,并自动在字符串尾部加上一个换行符。注意,puts函数只能输出字符串。
4. getchar和putchar适合处理单个字符。getchar函数从标准输入流中读入一个字符并返回整型数据,putchar函数将一个字符输出到标准输出流中。
相关问题
getchar puthchar gets scanf puts 的用法不同点
这些函数都是C语言中用于输入输出的函数,但是它们的用法有一些不同点:
1. `getchar()`:从标准输入流中读取一个字符,并将其作为无符号字符返回。它通常用于逐字符读取用户输入。
2. `putchar()`:将一个字符写入标准输出流。它通常用于逐字符输出。
3. `gets()`:从标准输入流中读取一行字符,并将其存储到一个字符串中。需要注意的是,`gets()`没有提供缓冲区溢出保护,容易导致安全漏洞,因此在实际使用中不推荐使用。
4. `scanf()`:从标准输入流中读取格式化输入,可以按照指定的格式将输入数据存储到指定的变量中。它可以读取各种数据类型,如整数、浮点数、字符串等。
5. `puts()`:向标准输出流中写入一个字符串,并自动添加换行符。它通常用于输出一行文本。
总结起来,`getchar()` 和 `putchar()` 用于逐字符的输入输出,`gets()` 用于读取一行字符串(不推荐使用),`scanf()` 用于格式化输入,而 `puts()` 用于输出字符串并添加换行符。
#include<stdio.h> #include<string.h> int main() { int i=0,j,k,n,t,m,x; char c[101],a[101]; scanf("%d",&t); while(i<t) { scanf("%d %d",&m,&n); getchar(); gets(c); x=strlen(c); j=0; if(n>x) n=x-1; for(k=m;k<=n;k++) { a[j]=c[k]; j++; } i++; puts(a); } }他为什么输出我没有输入的字符
这段代码的问题在于,定义了字符数组 `a`,但没有初始化。因此,当从输入流中读取字符串时,`a`中可能会存在之前的遗留字符,导致输出的结果不正确。
为了解决这个问题,可以在每次循环开始前,将字符数组 `a` 中的元素全部清零,可以使用 `memset` 函数实现:
```
memset(a, 0, sizeof(a));
```
另外,在输出字符串前,需要在字符串的末尾添加一个结束符 `\0`,否则可能会输出一些无法预知的字符。可以在字符数组 `a` 的最后一个位置手动添加 `\0`:
```
a[j] = '\0';
```
修改后的代码如下:
```
#include <stdio.h>
#include <string.h>
int main() {
int i = 0, j, k, n, t, m, x;
char c[101], a[101];
scanf("%d", &t);
while (i < t) {
scanf("%d %d", &m, &n);
getchar();
gets(c);
x = strlen(c);
j = 0;
if (n > x)
n = x - 1;
memset(a, 0, sizeof(a)); // 清空字符数组 a
for (k = m; k <= n; k++) {
a[j] = c[k];
j++;
}
i++;
a[j] = '\0'; // 添加字符串结束符
puts(a);
}
return 0;
}
```