Tag: fgets

读取用户输入时fgets分段错误

这是使用ubuntu的违规代码 char *name; int main(void) { fgets(name, sizeof(name), stdin); } void HUD() { printf(“%s “, name); } 这是我的问题。 我开始使用scanf(“%s”,&name)并在字符串末尾收到垃圾邮件。 在过去的2个小时里一直在阅读scanf和fgets上的文档,因为当你不知道所需数组的大小时,显然不应该使用scanf(并且由于用户输入的大小不同)我决定尝试使用fgets。 我也试过用char name [100]设置一个固定值; 并通过fgets(name,100,stdin) 现在我得到了一个分段错误,通过阅读我在google的前两页找到的每个结果,我的语法看起来是正确的,我在cboard上找不到任何内容或在这里解决我的问题。 有任何想法吗?

C – 替换单词

我的目标是从stdin重定向的文件中读取文本,然后用单词“Replaced”替换某些argv传递的单词。 例如,如果我运行: $ ./a.exe line < input.txt 其中input.txt是“Test line one”,最后我应该打印“Test Replaced one”。 我不太确定我的代码出错了哪里,有时我会出现分段错误,而且我也不确定如何打印newOut字符串,或者我甚至需要一个。 作为旁注,如果我正在使用fgets读取,如果第59个字符开始“li”,那么当它再次开始作为下一个读取命令的第0个索引“ne”时,该怎么办? 难道这不算作strstr搜索的一个字符串吗? 任何帮助表示赞赏,谢谢 #include #include #include int main(int argc, char** argv) { char fileRead[60]; char newOut[]; while (!feof(stdin)){ fgets(fileRead,60,stdin); //read file 60 characters at a time if (strstr(fileRead,argv[1])){ // if argumentv[1] is contained in fileRead strncpy(newOut, fileRead, strlen(argv[1])); // replace } } […]

从stdin读取字符串

我试图用这种格式从stdin读取一行: Boston “New York” “San Francisco” Memphis (请注意,其中包含空格的字符串位于括号之间。另请注意,每个城市名称都以空格分隔。)我试图一次用scanf读取一个, fgets整行然后标记,但结果不好。 我假装将所有内容存储在多维字符数组中供以后使用。 关于如何解决这个问题的任何建议? 先感谢您!

从fgets中删除换行符

如果这个问题很明显,或者我犯了一个简单的逻辑错误,我很抱歉。 我已经搜索了各种方法来摆脱使用fgets产生的换行符,但是在构建时我仍然遇到问题。 我认为我不能正确理解某些内容并错误地应用我的“解决方案”。 我希望透明,并说这是学校的任务。 一切都运行良好,除了我的输出,它有不必要的新行。 此函数的唯一目的是将名称读入结构数组。 void initialize(FILE * ifp, Candidate * electionCandidates, int count) { for (int i = 0; i < count; i++) { fgets (electionCandidates[i].name , 20 , ifp); if (electionCandidates[i].name[strlen(electionCandidates[i].name) – 1] == '\n') { electionCandidates[i].name[strlen(electionCandidates[i].name) – 1] = '\0'; } } } 当我尝试运行时显示以下内容:“隐式声明库函数”strlen“类型为unsigned long(constant char *)”

如何在使用结构指针时实现gets()或fgets()?

下面的代码与scanf()运行完美,但我想输入字符和空格。 我已经尝试了gets()和fgets() (在下面评论),但它不起作用(它跳转到循环中的下一次迭代并在输出fgets()使用的Name输入期间显示空白(NULL)。 知道怎么做吗? PS:我用样本程序试过fputs() ,工作正常。 但是在使用结构指针时我很困惑。 #include #include struct details { uint Id; char Name[20]; }; int main() { int tot, i; struct details *info; printf(“Enter no. of details to be stored = “); scanf(“%d”, &tot); info = (struct details *)malloc(tot*sizeof(struct details)); for(i=0; iId); printf(“%d)Name = “, i+1); fgets(info->Name, 20, stdin); //How to make […]

fgets最大尺寸读取

使用fgets输入字符串,我怀疑与字符串读取的长度有关。 例如,请考虑以下程序。 char str[50]; int i; int len; printf(“Enter name:\n”); fgets(str,11,stdin); len = strlen(str); printf(“len : %d\n”,len); 如果我输入123456789 , strlen给出10。 如果我输入1234567890 , strlen再次给出10? 我认为strlen也在考虑字符串长度换行。 我对么? (我理解fgets使用换行作为字符串的一部分) 有什么问题(2)我只输入10个字符,这里的字符串长度应该是11吗? 10 + 1(换行)= 11

代码没有使用fgets达到语句?

我编写了使用fgets函数的代码,该函数具有调用代码中其他函数的多个条件,即aMethod和bMethod。 int main(void) { char buffer[1024]; while (fgets(buffer, 1024, stdin)) { if ((strcasecmp(buffer,”a”)) == 0) { aMethod(); } if ((strcasecmp(buffer, “b”)) == 0) { bMethod(); } } } 我不确定为什么它没有达到if语句。 任何帮助都会很棒,谢谢。

如何从C中的fgets中删除多余的字符输入?

我听说使用gets()在C编程中很糟糕,并且使用fgets更安全……所以我使用的是fgets。 但是,我遇到了fgets的问题:我输入了太多字符,不知怎的,它溢出了。 如何摆脱额外的输入字符? char answer[4]; char answer2[4]; fgets(answer,sizeof(answer),stdin); printf(“answer: %s\n”,answer); fgets(answer2,sizeof(answer2),stdin); printf(“answer2: %s\n”,answer2); 例如,对于第一个fgets,我输入123456,我得到的输出是 answer: 123 answer2: 456 如何删除456进入下一个fgets输入? 在为第一个fgets输入123456之后,我想要这样的输出: answer: 123 然后,用户继续输入下一个fgets的输入…

为什么不是scanf(“%* \ n”); 和scanf(“%* %* c”); 清除挂线?

调用scanf(“%d”, &variable); 我们留下了一个挂在stdin的换行符,它应该在调用fgets之前清除,或者我们最终将它换成换行符并使其过早返回。 我找到了建议使用scanf(“%*[^\n]%*c”);答案scanf(“%*[^\n]%*c”); 在第一次调用scanf以丢弃换行符后,其他人建议使用scanf(“%*[^\n]\n”); 。 从理论上讲,两者都应该有效:第一个会消耗所有非换行符(但不包括换行符本身),然后只消耗一个字符(换行符)。 第二个将消耗所有非换行符(不包括它),然后\n ,一个空白字符,将指示scanf读取每个空白字符直到第一个非空白字符。 然而,尽管我看起来这些方法在某些答案中起作用,但我无法让它们在这里工作(下面的代码)。 为什么scanf方法都scanf ? 测试:Ubuntu Linux – gcc 5.4.0 scanf(“%*[^\n]\n”); 做法: #include int main(int argc, char **argv){ int number; char buffer[1024]; printf(“Write number: \n”); scanf(“%d”, &number); //Clearing stdin? scanf(“%*[^\n]\n”); printf(“Write phrase: \n”); fgets(buffer, 1024, stdin); printf(“\n\nYou wrote:%u and \”%s\”\n”, number, buffer); return 0; } 输出: $ ./bug […]

C:使用fread()/ fgets()而不是fgetc()(块I / O与字符I / O)逐行读取文本文件(带有可变长度行)

是否有使用fread (块I / O)而不是fgetc (字符I / O)的getline函数? 通过fgetc逐个字符地读取文件会有性能损失。 我们认为为了提高性能,我们可以在getline的内部循环中通过fread使用块读取。 然而,这引入了读取超过行尾的潜在不良影响。 至少,这需要实现getline来跟踪文件的“未读”部分,这需要超出ANSI C FILE语义的抽象。 这不是我们想要自己实现的东西! 我们已经分析了我们的应用程序,并且由于我们通过fgetc逐个字符地消耗大型文件,因此速度慢。 通过比较,其余的开销实际上具有微不足道的成本。 我们总是按顺序读取文件的每一行,从开始到结束,我们可以在读取期间锁定整个文件。 这可能使基于fread的getline更容易实现。 那么,是否存在使用fread (块I / O)而不是fgetc (字符I / O)的getline函数? 我们非常肯定它确实如此,但如果没有,我们应该如何实施呢? 更新发现了一篇有用的文章, 在C中处理用户输入 ,由Paul Hsieh撰写。 这是一个基于fgetc的方法,但它有一个有趣的讨论替代方案(从有多糟糕的开始,然后讨论fgets ): 另一方面,来自C程序员的常见反驳(即使是那些经验丰富的程序员)也就是说应该使用fgets()作为替代。 当然, fgets()本身并不能真正处理用户输入。 除了具有奇怪的字符串终止条件(在遇到\ n或EOF,但不是\ 0时),当缓冲区达到容量时选择终止的机制是简单地突然停止fgets()操作并且\ 0终止它。 因此,如果用户输入超过预分配缓冲区的长度, fgets()将返回部分结果。 处理这个程序员有几个选择; 1)简单地处理截断的用户输入(没有办法向用户反馈输入被截断,而他们提供输入)2)模拟一个可增长的字符数组并用连续的fgets()调用填充它。 对于可变长度的用户输入,第一个解决方案几乎总是一个非常糟糕的解决方案,因为缓冲区在大多数情况下不可避免地会过大,因为它试图捕获太多普通情况,而对于exception情况则太小。 第二种解决方案很好,只是正确实施可能很复杂。 两者都不涉及fgets在’\ 0’方面的奇怪行为。 练习留给读者:为了确定通过调用fgets()确实读取了多少字节,可以尝试扫描,就像它一样,为’\ n’并跳过任何’\ 0’而不超过传递给fgets()的大小。 解释为什么这对于流的最后一行是不够的。 ftell()的弱点是什么阻止它完全解决这个问题? 练习留给读者:通过在每次调用fgets()之间用非零值覆盖整个缓冲区来解决确定fgets()消耗的数据长度的问题。 因此,使用fgets(),我们可以选择编写大量代码并使用与C库的其余部分不一致或具有任意截止的行终止条件。 如果这还不够好,那么我们还剩下什么? […]