为什么从控制台读取字符串时scanf中的%n返回0

无人

我试图编写一个程序,该程序需要从用户(控制台)开始一行,直到遇到逗号,句号或换行符,并告诉按照特定模式读取了多少个字符。

正确读取字符串,但计数不正确。

#include <stdio.h>

int main()
{
    int n;
    char s[100];


    // The following line should read a string until (. or , or new-line in encountered) 
    // and %n should tell me the no of characters it read until that point
    scanf("%[^.,\n]s%n", s, &n);


    // The String in okay
    printf("%s\n", s);

    // But count of characters read is 0
    printf("%d\n",n);

    return 0;
}
chux-恢复莫妮卡

5个问题:

"s""%[^.,\n]s%n",因为可以不停止扫描's'后读取%[^.,\n]%[^.,\n]会全部阅读's'因此,后面的代码"%n"永远不会发生n,而后来打印的0代码则是错误的代码-打印未初始化的代码-n可能是任意代码int或陷阱。

扫描没有宽度限制。第99个字符之后发生坏事。

使用时scanf("%[^.,\n]s%n", s, &n);s如果第一个字符是,扫描将不会保存任何内容.,\n后来的列印s不良,因为s[]尚未初始化。

代码无法检查的返回值scanf()

scanf()不一定会按照“编写从用户那里获取代码的程序”的指示来读取代码-停止使用scanf()
C Std Lib定义了以下一行,因此代码应尝试读取整行。

文本流是由行组成的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。


scanf() 另类

int n = 0;
char s[100];
s[0] = '\0';

int cnt == scanf("%99[^.,\n]%n", s, &n);
if (cnt == EOF) puts("Nothing was read");
else printf("%s\n", s);

更好的选择

我建议您使用fgets()而不是scanf()从user中提取一行

char s[100];
if (fgets(s, sizeof s, stdin)) {
  size_t n = strcspn(s, ".,\n");   // offset of string that does not have .,\n
  s[n] = '\0';
  printf("%s\n", s);
  printf("%zu\n", n);
}

注意:超过约100行的行需要附加代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中读取字符串时scanf的行为

来自分类Dev

读取Java中的控制台字符串

来自分类Dev

从控制台读取字符串而无需for循环

来自分类Dev

C scanf()scansets从控制台读取逗号分隔的值(字符串和整数)

来自分类Dev

在malloc()ed对象中读取字符串错误的字符时出错。为什么?

来自分类Dev

从控制台读取字符

来自分类Dev

从控制台读取多字字符串

来自分类Dev

为什么 scanf 跳过获取字符串输入?

来自分类Dev

从控制台应用程序返回字符串

来自分类Dev

从控制台的一行中读取整数和字符串

来自分类Dev

为什么我的.indexOf不读取字符串中字符的位置

来自分类Dev

如何正确地从hyper :: client :: Request读取字节序列并将其作为UTF-8字符串打印到控制台?

来自分类Dev

我需要为具有一些策略的控制台应用程序编写一个读取字符串方法

来自分类Dev

为什么我无法在Javascript上控制台记录/字符串化整个数组?

来自分类Dev

为什么我无法在Javascript上控制台记录/字符串化整个数组?

来自分类Dev

尝试从Jframe中的表中获取字符串时,为什么会出现错误?

来自分类Dev

如何防止在输入密码时将退格字符串“ \ b \ 0 \ b”打印到控制台

来自分类Dev

为什么字符串中的反斜杠(\)在控制台中给出错误

来自分类Dev

从文件中读取字符串时,String.split不会与\ n分开

来自分类Dev

为什么我的代码在提取字符串时无法在Python Regex中工作

来自分类Dev

使用scanf读取字符串作为输入

来自分类Dev

在单个 scanf 中获取字符串和整数会在获取字符串后跳过其余的整数,为什么?如何仅在单个 scanf 中执行此操作?

来自分类Dev

在控制台应用程序中更改内容时,是否可以在固定位置显示字符串?

来自分类Dev

在Haskell中读取字符串

来自分类Dev

在C ++中读取字符串

来自分类Dev

在Haskell中读取字符串

来自分类Dev

在C ++中读取字符串

来自分类Dev

从文件中读取字符串

来自分类Dev

typeof返回字符串,但控制台日志[object Object]

Related 相关文章

  1. 1

    在C中读取字符串时scanf的行为

  2. 2

    读取Java中的控制台字符串

  3. 3

    从控制台读取字符串而无需for循环

  4. 4

    C scanf()scansets从控制台读取逗号分隔的值(字符串和整数)

  5. 5

    在malloc()ed对象中读取字符串错误的字符时出错。为什么?

  6. 6

    从控制台读取字符

  7. 7

    从控制台读取多字字符串

  8. 8

    为什么 scanf 跳过获取字符串输入?

  9. 9

    从控制台应用程序返回字符串

  10. 10

    从控制台的一行中读取整数和字符串

  11. 11

    为什么我的.indexOf不读取字符串中字符的位置

  12. 12

    如何正确地从hyper :: client :: Request读取字节序列并将其作为UTF-8字符串打印到控制台?

  13. 13

    我需要为具有一些策略的控制台应用程序编写一个读取字符串方法

  14. 14

    为什么我无法在Javascript上控制台记录/字符串化整个数组?

  15. 15

    为什么我无法在Javascript上控制台记录/字符串化整个数组?

  16. 16

    尝试从Jframe中的表中获取字符串时,为什么会出现错误?

  17. 17

    如何防止在输入密码时将退格字符串“ \ b \ 0 \ b”打印到控制台

  18. 18

    为什么字符串中的反斜杠(\)在控制台中给出错误

  19. 19

    从文件中读取字符串时,String.split不会与\ n分开

  20. 20

    为什么我的代码在提取字符串时无法在Python Regex中工作

  21. 21

    使用scanf读取字符串作为输入

  22. 22

    在单个 scanf 中获取字符串和整数会在获取字符串后跳过其余的整数,为什么?如何仅在单个 scanf 中执行此操作?

  23. 23

    在控制台应用程序中更改内容时,是否可以在固定位置显示字符串?

  24. 24

    在Haskell中读取字符串

  25. 25

    在C ++中读取字符串

  26. 26

    在Haskell中读取字符串

  27. 27

    在C ++中读取字符串

  28. 28

    从文件中读取字符串

  29. 29

    typeof返回字符串,但控制台日志[object Object]

热门标签

归档