【问题标题】:How do I properly 'printf' an integer and a string in C?如何在 C 中正确地“printf”一个整数和一个字符串?
【发布时间】:2012-07-28 18:20:58
【问题描述】:

我有以下代码:

char *s1, *s2;
char str[10];

printf("Type a string: ");
scanf("%s", str);

s1 = &str[0];
s2 = &str[2];

printf("%s\n", s1);
printf("%s\n", s2);

当我运行代码时,输​​入“A 1”如下:

Type a string: A 1

我得到了以下结果:

A
�<�

我正在尝试将第一个字符读取为字符串,将第三个字符读取为整数,然后将它们打印在屏幕上。第一个字符总是有效,但之后屏幕只会显示随机的东西......我应该如何解决它?

【问题讨论】:

  • 另一件人们暂时没有提到的事情:请不要扫描到有限大小的缓冲区。用户可以轻松地输入超过限制的内容,然后将您的程序搞砸。 (另见:缓冲区溢出攻击)
  • @DennisMeng:可以添加宽度说明符,例如%123s。它仍然具有潜在的危险,因为该宽度不包括空终止符。
  • @diapir 是的。重要的是避免缓冲区溢出。

标签: c string input printf


【解决方案1】:

试试这个代码我的朋友...

#include<stdio.h>
int main(){
   char *s1, *s2;
   char str[10];

   printf("type a string: ");
   scanf("%s", str);

   s1 = &str[0];
   s2 = &str[2];

   printf("%c\n", *s1);   //use %c instead of %s and *s1 which is the content of position 1
   printf("%c\n", *s2);   //use %c instead of %s and *s3 which is the content of position 1

   return 0;
}

【讨论】:

    【解决方案2】:

    scanf("%s",str) 只扫描直到找到空白字符。使用输入"A 1",它将仅扫描第一个字符,因此s2 指向恰好在str 中的垃圾,因为该数组未初始化。

    【讨论】:

    • 是的,我意识到如果我输入“ABCFS”,它不会显示垃圾。我现在知道问题出在哪里了。谢谢!
    【解决方案3】:

    你在正确的轨道上。这是一个更正的版本:

    char str[10];
    int n;
    
    printf("type a string: ");
    scanf("%s %d", str, &n);
    
    printf("%s\n", str);
    printf("%d\n", n);
    

    让我们来谈谈变化:

    1. 分配一个 int (n) 来存储您的号码
    2. 告诉scanf 先读入一个字符串,然后读入一个数字(%d 表示数字,正如你已经从printf 中知道的那样

    这就是它的全部内容。您的代码仍然有点危险,因为任何超过 9 个字符的用户输入都会溢出str 并开始践踏您的堆栈。

    【讨论】:

    • 啊,非常感谢!!没有意识到我可以这样做。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多