作为初学者对c语言输入的问题

发布时间 2023-12-10 16:38:03作者: Blizzard1900

  初学c不久,在scanf gets getchar的使用总是出现问题,最近仍然有疑惑,也看视频和问chatgpt,以下内容来自chatgpt。(很多内容博客园也都有,这里也就相当于我的笔记了吧)

1,问:getchar putchar gets在c语言中的区别?

-----------------------------------------------------------------------------------------------------------------------------------------

在C语言中,`getchar`、`putchar`和`gets`是一些用于输入和输出的标准库函数。它们的主要区别在于它们的功能和用途。

1. **getchar:**
- `getchar` 是一个用于从标准输入(通常是键盘)获取一个字符的函数。
- 它的原型为 `int getchar(void);`,返回输入的字符的ASCII码值(或者EOF,表示文件结束)。
- 例子:
```c
#include <stdio.h>

int main() {
int c = getchar();
printf("You entered: %c\n", c);
return 0;
}
```

2. **putchar:**
- `putchar` 是一个用于将一个字符输出到标准输出(通常是屏幕)的函数。
- 它的原型为 `int putchar(int char);`,其中参数是要输出的字符的ASCII码值。
- 例子:
```c
#include <stdio.h>

int main() {
char c = 'A';
putchar(c);
return 0;
}
```

3. **gets:**
- `gets` 函数用于从标准输入读取一行字符串,但是它存在严重的安全问题,因为它没有指定字符串的最大长度,可能导致缓冲区溢出。
- 它的原型为 `char *gets(char *str);`,返回一个指向输入字符串的指针。
- 由于安全性问题,C99标准中已经弃用了`gets`函数,推荐使用更安全的`fgets`函数。
- 例子:
```c
#include <stdio.h>

int main() {
char str[50];
printf("Enter a string: ");
gets(str);
printf("You entered: %s\n", str);
return 0;
}
```

总体而言,应该尽量避免使用`gets`,而是使用更安全的替代方法,比如使用`fgets`来读取字符串。`getchar`和`putchar`则是用于字符输入输出的简单函数。

 


-----------------------------------------------------------------------------------------------------------------------------------------

2,问:scanf的注意事项(我认为初学者需要特别注意)

 
 
 -----------------------------------------------------------------------------------------------------------------------------------------

`scanf` 是C语言中用于从标准输入或其他流中读取格式化数据的函数。虽然它是强大的,但在使用时需要注意一些问题:

1. **输入缓冲区溢出:**
- 如果输入的数据超出了`scanf`指定的变量的存储空间,会导致缓冲区溢出,可能破坏程序的内存结构。
- 解决方法是确保指定的变量足够大,或者使用格式说明符中的宽度限定符来限制输入的字符数。

```c
int num;
scanf("%d", &num); // 没有限制输入宽度,存在缓冲区溢出的风险
```

2. **错误处理:**
- `scanf` 的返回值是成功读取的参数的个数,因此可以用来检测输入是否匹配预期。
- 检查返回值可以帮助处理输入错误的情况。

```c
int num;
if (scanf("%d", &num) != 1) {
printf("Invalid input\n");
}
```

3. **格式说明符匹配:**
- 确保使用正确的格式说明符匹配输入的数据类型,否则可能导致错误或未定义的行为。

```c
int num;
char ch;
scanf("%d", &ch); // 错误,应该使用 %c 而不是 %d
```

4. **缓冲区留白:**
- `scanf` 在读取数字后会将换行符留在输入缓冲区中,这可能会影响后续的输入操作。
- 在使用 `scanf` 后最好清空输入缓冲区。

```c
int num;
scanf("%d", &num);
getchar(); // 清空输入缓冲区中的换行符
```

5. **空白字符的处理:**
- `scanf` 会忽略输入中的空白字符(空格、制表符、换行符等),这可能影响到预期的输入。
- 如果需要在格式控制字符串中处理空白字符,可以使用空白字符匹配符 `%*`。

```c
int num1, num2;
scanf("%d%*c%d", &num1, &num2); // 忽略中间的字符,例如输入 "10a20"
```

总的来说,使用 `scanf` 时要小心处理边界情况,确保输入的合法性,并适当处理错误。如果可能的话,考虑使用更安全的输入函数,比如 `fgets` 配合 `sscanf` 或者更加安全的 `scanf` 替代品。

 

-----------------------------------------------------------------------------------------------------------------------------------------