【问题标题】:scanning a line of strings with spaces using scanf使用 scanf 扫描一行带有空格的字符串
【发布时间】:2017-03-04 11:21:28
【问题描述】:

我在 C 语言中的所有输入都使用 scanf。现在我看到了关于 scanf() 的其他类似问题,他们建议使用 fgets() 而不是 scanf()。我将来会这样做。然而,目前scanf() 的这部分代码似乎从来没有工作过。我知道有一个解决方案。

我的代码是:

#define LENGTH 1000
#define WORD 100
int main(){
    int i = 0;
    char s[WORD][LENGTH];
    do {
        scanf("%s", s[i]);
        i++;
    }
    while (s[i][strlen(s[i])] != EOF);
    printf("%s\n", s);

    return 0;
}

在检查行尾的while循环中应该有一些东西而不是EOF。最终结果应该是s[] 中的单词数组,并且程序应该打印出不带空格的单词数组。

【问题讨论】:

  • 我遇到了while (scanf("%s", &str[strlen(str)]) == 1)。我在这里是全新的。正如 Iharob Al Asimi 解释的那样,这是错误的。请您解释一下为什么这个解决方案不正确?或者为什么我不能在我的代码中使用它?

标签: c input scanf stdio


【解决方案1】:

很遗憾,scanf() 没有读取您需要检查行尾的字符,或者至少没有使用 "%s" 作为说明符。

改为使用以下

char line[100];
if (scanf("%99[^\n]", line) == 1) {
    fprintf(stdout, "%s\n", line);
}

这样,它不会在空白字符处停止,它的行为类似于fgets(),只是它不读取'\n' 字符,如果再次调用它可能会出现问题。

【讨论】:

  • 现在我知道 scanf() 的用途非常有限。有什么方法可以让我的代码退出 while 循环,并将字符串数组存储在内存中?这样我就可以稍后在程序中使用数组 s[]。
  • 您可以使用与字符串相同的技巧,请注意您的问题似乎并没有要求这样做。简单的解决方案是,计算单词并保留一个具有该值的变量,以便您以后可以使用它。复杂的解决方案是,使用指针并在你的单词数组末尾添加一个NULL 指针,然后for (int i = 0 ; s[i] != NULL ; ++i) ... 将遍历所有单词,对字符串做同样的事情。
  • 好吧,我找到了一个适用于 scanf() 的解决方案:while (scanf("%s", &s[strlen(s)]) == 1); 这将确保在“输入”之前扫描整行
  • @SaidAkbar 这看起来很糟糕,你的编译器不是像疯了一样抛出一堆警告吗?不要这样使用strlen(),请阅读手册。
  • 令人惊讶的是,该代码在 gcc 上正常工作,并且正确通过了所有测试。显然,scanf() 也可以处理一行带空格的字符串。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多