2015-11-04 86 views
0

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

#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; 
} 

例如,假设I型,(空间)苹果公司(按Enter键) 我能以某种方式打印出内部表示,这是我觉得有点 类似(ASCII空间)(” ''''''''''''''n' 它不会在缓冲区中存储'\ n'我认为? 现在理解如果我给出一个空格分隔的字符串会发生什么,我知道scanf会丢弃它。

但我不明白流是如何保持缓冲的,为什么理解它很重要?没有冒犯,我真的很困惑stdin文件操作& scanf在C也许一个很好的例子来说明这一点。 我不是一个非常讨厌的家伙,所以我觉得手册不是很初学者友好。 我在文件输入\输出用C很有兴趣:) :) :)

回答

0
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'; 
}