2012-07-31 25 views
14

我有以下代码:如何在c中正确printf整数和字符串?

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 
�<� 

我试图读取第一个字符作为字符串和第三个字符作为整数,然后在屏幕上打印出来。第一个角色总是可以工作,但屏幕之后会显示随机的东西....我应该如何解决它?

谢谢

+1

另一件事,人们没有了一点提到:请不要SCANF为有限大小的缓冲区。用户可以轻松输入超过极限值并将程序结束。 (另请参阅:缓冲区溢出攻击) – 2012-07-31 02:54:05

+0

@ DennisMeng:可以添加宽度说明符,例如'%123s'。由于该宽度不包含空终止符,因此它仍然具有潜在的危险性。 – diapir 2014-06-07 10:54:11

+0

@diapir真的。重要的一点是避免缓冲区溢出。 – 2014-06-07 20:10:12

回答

22

你在正确的轨道上。这里有一个修正版本:

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并开始践踏您的堆栈。

+0

啊,非常感谢!没有意识到我可以这样做。谢谢! – user1420474 2012-07-31 02:54:19

5

scanf("%s",str)只扫描直到找到空白字符。在输入"A 1"时,它只会扫描第一个字符,因此s2指向发生在str的垃圾,因为该数组未被初始化。

+0

是的,我意识到如果我输入“ABCFS”,它不会显示垃圾。我现在知道问题出在哪里。谢谢! – user1420474 2012-07-31 02:55:58

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; 
}