2015-01-07 110 views
-2
#include <stdio.h> 
main() 
{ 
    char name1[15],name2[15],name3[15]; 
    int no; 

    printf("Enter the serial number and name one\n"); 
    scanf("%d %15c',&no, name1"); 
    printf("%d %15s\n\n",no,name1); 

    printf("Enter serial number and name two\n"); 
    scanf("%d %s",&no,name2); 
    printf("%d %15s\n\n",no, name2); 

    printf("Enter serial number and name three"); 
    scanf("%d %15s",&no,name3); 
    printf("%d %15s\n\n",no,name3); 
} 

嗨,我是编程新手,由于某些原因我开始使用C语言。我上面输入的代码是我想要执行的程序。当我使用Code :: Blocks执行它时,它会一直运行到输入序列号并命名一个,然后如果我输入一个数字,它将不会响应。然后我试着编译使用Visual Studio 2013它再次停止响应。请告诉我哪里出了问题

之后,我尝试使用Visual Studio 2013调试器进行调试,它表示此temp.exe中0x7575B790(msvcrt.dll)的第一次机会异常:0xC0000005:访问冲突写入位置0x00000000。后按继续它说这未处理的异常在0x7575B790(msvcrt.dll)temp.exe中:0xC0000005:访问冲突写入位置0x00000000。 我已经编程在Code :: Blocks之前,它们都运行良好。请告诉我我哪里出了问题。另请说明%s的用法。

感谢

+5

阅读[如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-程式/)。当你在这里时,找到'printf'和'scanf'的文档。如果你不明白他们是如何工作的,你可能不会弄清楚什么是错的。 – Doval

+0

我很抱歉如此愚蠢。谢谢btw:P –

回答

6
scanf("%d %15c',&no, name1"); 

应改为:

scanf("%d %14s",&no, name1); 
  • 使用双引号,因为单引号不C.终止字符串
  • 使用%14s(如建议通过chux),这样你就不会溢出缓冲区的字符串并导致段错误

%s用于读取空格分隔的字符串。如果你想读整行,你必须利用fgets函数

+3

建议'“%d%14s”' – chux

+3

只是为了重申chux的观点。请注意,chux写了__14__而不是__15__。这将确保scanf在添加空终止字符时不会导致缓冲区溢出。 –