c - Scanf 字符串空间问题 C

标签 c stdin

嗯,我知道已经提出了很多类似的问题,但是,如果需要的话我愿意澄清,因为我的问题可能不是很清楚。 所以它是这样的,假设我想在 C 中获得一个空格分隔的名称字符串。 或者一般来说,我想了解 scanf 为什么它在 C 中的文件 I/O 情况下对字符串表现得如此奇怪。我想擅长调试这些东西。 我应该能够打印完整的字符串,只要它不超过我在 C 中的字符数组限制。 我在这个主题上搜索了很多,但如果可以通过某种方式打印出 C 中 stdin 的内部表示。 例如:-

#include<stdio.h>
#include<stdlib.h>
int main() {
     char name[100];    // accept 100 chars

     printf("\nEnter your name: "); // This writes to stream stdout
     scanf("%100s",name);   // Specify char limit in scanf 
     while(getchar()!='\n');   // Until user presses 'Enter' else scan 100 chars
     return 0;
}

例如,假设我输入,(空格)Apple(按 Enter) 我可以以某种方式打印出内部表示,我认为这有点 类似于(空格的 ASCII)('A''p''p''l''e''\0')'\n' 我认为它不会在缓冲区中存储“\n”? 现在要理解如果我给出一个空格分隔的字符串会发生什么就变得有点复杂了,我知道 scanf 会丢弃它。

但我无法理解流如何保持缓冲以及为什么理解这一点如此重要?无意冒犯,我真的对 C 中的 stdin 文件操作和 scanf 感到困惑。也许有一些很好的例子来说明这一点。 我不是一个非常 Nerd 的人,所以我发现手册对初学者不太友好。 我对 C 中的文件输入\输出绝对感兴趣:):):)

最佳答案

scanf("%100s",name);   // Specify char limit in scanf 

指定可以读入name的最大字符数。顺便说一句,这应该是 99,因为您需要数组的一个元素作为终止空字符。但是,这并不强制读取 100 个字符。当遇到空格时它仍然会停止。要读取整行,请使用 fgets 并确保修剪结束换行符。

fgets(name, 100, stdin); // You use 100 here. fgets will read at
                         // most 99 characters.
int len = strlen(name);
if ( name[len-1] == '\n' )
{
   name[len-1] = '\0';
}

关于c - Scanf 字符串空间问题 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512793/

相关文章:

c - 如何在 C 中将 void 指针转换为结构?

c++ - std::cin 到 char 数组会跳过空格吗?

c - c 中的快速 I/O,stdin/out

c++ - 从 ifstream 读取 stdin/cin 是否安全?

C 字符指针

c - “main”声明为返回函数的函数

C - 数据不能分配给全局变量

bash - 如何将 stdin 从 shell 脚本重定向到 shell 脚本中的命令?

c++ - 使用 read 从 stdin 读取

c - 我的 for 循环打印出垃圾 - 我找不到错误