【问题标题】:strings and whitespaces in CC中的字符串和空格
【发布时间】:2021-03-09 13:24:51
【问题描述】:

我得到格式 %s 需要 *char 类型的参数,但参数是 int 类型,这里出错,谁能帮我解决这个问题?这是一个简单的代码,但我还没有更精简的指针,我不知道如何解决这个问题。

int main()
{
  
  int items;
  int i;

     //main menu of the program
    printf("*********WELCOME TO ABC FASHION STORE***********\n");
    printf("\t\t\t1.Make a new sale\n\t\t\t2.Exit from POS system\n");
    printf("-----------------------------------------------------");

   printf("How many different types of items in your sales:");
   scanf("%d",&items);

   char code[items];
   int qty[items];
   for(i=0;i<items;i++)
   {
    printf("Enter the item code:");
    scanf("%s", code[i]);
    printf("Enter the quantity:");
    scanf("%d",&qty[i]);
   }

   //displaying the details of consumer
  printf("\nITEM CODE \t\t QUANTITY \t\t UNIT PRICE \t\t TOTAL\n");
  for(i=0;i<items;i++)
  {
   printf("%s\t\t%d\t\t", code[i],qty[i]);
  }

【问题讨论】:

  • 您正在尝试读取一个字符。它应该去:scanf("%c", &amp;code[i]);printf("%c\t\t%d\t\t", code[i],qty[i]);
  • 我正在尝试读取像“WB100”这样的字符串
  • 那么你应该做scanf("%s", code);,因为你试图阅读整个单词而不是单个字符。以及类似地用 printf 打印整个单词。
  • 你的错误是什么?编译错误或运行时出错。您能否也将错误文本添加到您的问题中?
  • “谁能帮我解决这个问题”。发布的第一个答案是您问题的真实答案,而不是您接受的答案。即解释您在编译警告中看到的内容的答案提供了您可以用来自己解决问题的信息。您接受的答案给了您一个不需要您考虑的解​​决方案。如果您对编码很认真,请避免走阻力最小的道路,并接受有助于您学习的建议。

标签: arrays c string


【解决方案1】:

对于初学者,你有:

   char code[items];
   ...
   scanf("%s", code[i]);

所以code 是一个字符数组,code[i] 代表单个字符——而不是字符串!你可能追求的是:

   #define MAX_LEN 50
   char code[items][MAX_LEN];
 ...
   scanf("%s", code[i]);

这使代码成为一个字符串数组,每个字符串最长为MAX_LEN

现在,上面有一个很大的安全问题——你没有指定数组的最大大小,用户可以输入一个很长的字符串,超出数组的末尾。聪明和恶意的用户可以使用它来覆盖程序中的其他内存部分......因此,您可以限制 scanf 接受的字符串大小:scanf("%50s", code[i]);,它将输入限制为 50 个字符。但是如果你更改了MAX_LEN,而忘记更改宽度说明符,你就会遇到麻烦。 正确的解决方案描述here;

   #define MAX_LEN 50
   #define STR(x) _STR(x)
   #define _STR(x) #x
   char code[items][MAX_LEN];
 ...
   scanf("%" STR(MAX_LEN) "s", code[i]);

对于 printf,您的问题是相同的——code[i] 是一个字符,而不是字符串指针,因此它与 %s 格式说明符不一致。如果将code 切换为字符串数组,它将起作用。

【讨论】:

    【解决方案2】:

    将此char code[items]; 替换为char code[items][100];

    如果您希望将代码作为字符串。

    【讨论】:

    • 是的,这是真正的错误,非常感谢,我错过了数组
    • @Zinzin 理解失败的原因也很重要,而不仅仅是我更改了代码,现在它可以工作了char 是一个字符,char[] (char array) 是一个字符串,所以 char[][] 是一个字符串数组。当然还有很多(内存分配、指针等),但这是一个开始。
    【解决方案3】:

    以你的方式使用 scanf 是不安全的,因为它会使你的程序容易受到缓冲区溢出的影响。

    你最好使用例如fgets 或 getline,将输入读取为字符串,然后验证内容并将其转换为之后需要的任何数据类型。

    stackoverflow 上有很多关于如何执行此操作的示例。 这里有一个例子:https://stackoverflow.com/a/24177745/10956302

    【讨论】:

    • 请考虑改进您的答案,以提供使用fgets()getline() 解决问题的代码。
    • 在 stackoverflow 上的快速搜索给出了答案。无需到处重复答案。我用链接更新了我原来的帖子。
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多