【问题标题】:GETS - C is not working for meGETS - C 不适合我
【发布时间】:2012-12-14 18:39:21
【问题描述】:

我在将字符串插入 char 变量时遇到问题。当我将其投入使用时出现问题。当我调试我的程序时,它会显示 printf 但它会跳过 gets

这是我的代码:

int uloz(SPRAVA *p){

    char string[200];

    printf("Your message here: ");
    gets(string);
    printf("You have entered: %s", string);
    getchar();

    return 0;
}

【问题讨论】:

  • 第一:永远不要使用gets;它非常危险(因此已从语言中删除)。第二:您能否详细说明会发生什么以及您预计会发生什么?
  • 我想为 ex 存储字符串。 “我的名字是马里奥。”,我想包含空格。
  • 然后会发生什么? gets (urgh) 和 fgets 读取空格没有问题,所以你的问题一定是别的。
  • 是的 fgets 正在从文件中读取...但我想在我的应用程序中输入一些字符串并将其存储在文件中
  • fgets(string, sizeof string, stdin); 从标准输入中读取一行或最多 199 个字符(一个用于 0 终止符)并将它们存储在 string 中。然后,您可以使用fprintf(file_pointer, "%s", string); 将其写入文件。如果这样做,有什么问题?

标签: c function printf gets


【解决方案1】:

使用scanf(" %30[^\n]%*c",string);

  1. [^\n] 将接受任何东西,直到 \n
  2. 30 将字符数限制为最大 30。
  3. 初始space(' ') 将消耗标准输入流中已有的任何\n。 (可选且我尚未验证)
  4. & 最后,%*c 将消耗输入字符串后按下的\n

我认为,scanf(" %30[^\n]%*[^\n]%*c",string); 将是一个不错的选择,可以丢弃输入的剩余字符(30 个之后)。然而,这是完全未经证实的。只是作为一个可能的想法添加。使用前进行测试。 :-)

【讨论】:

  • +1 这符合一般建议“不要混合 (f)gets 和 scanf”——如果您在其他地方使用 scanf,请在此处也使用 scanf。
【解决方案2】:

stdio 缓冲区中有一个换行符(由以前的一些 scanf 留下),所以 gets 立即得到满足。

没有简单的方法可以修复它,但您可以尝试在 fgets 之前丢弃输入:

while((c = getchar()) != '\n' && c != EOF)
    /* discard the character */;

真正的解决方案是避免混淆scanffgets


使用fgets 代替gets

【讨论】:

  • 更具体地说,如果您总是期望整行,但仍想从中获取整数等,则使用 fgets 读取一行,并使用 sscanf 对其进行解析。不仅 scanf,getchar(用于问题代码)也可能有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2011-08-11
  • 2011-01-05
  • 2011-12-23
相关资源
最近更新 更多