使用%S时出现异常错误

时间:2019-01-22 00:05:32

标签: c

int main()
 {
 int Age;
 char Name;

 //Age

 printf("Type your age: ");
 scanf_s("%d", &Age);
 printf("Your age is %d\n", Age);

 //Name

 printf("Type your Name: ");
 scanf_s("%s", &Name);
 printf("Your name is %s", Name);

 return 0; }

这是“名称”部分,抛出一个错误。我不知道为什么。

更新:我正在Visual Studio中编码。因此,基本上需要“ scanf_s”。

错误是“ Project1.exe中的0x5B49D4EC(ucrtbased.dll)引发异常:0xC0000005:发生访问冲突写入位置0x001A0000。”

4 个答案:

答案 0 :(得分:2)

您的问题是char Name;只能存储一个字符。您的代码允许用户输入存储在Name中的多个字符,从而导致内存错误。

char Name;更改为char Name[50]之类,以便您最多可以存储49个字符以及null字节。

此外,如果缓冲区(字符数组)最终变得太小,则应正确使用scanf_s()以避免错误。

请注意,您应始终检查scanf_s()的返回值,以便知道用户是否输入了有效数据。

此代码在Visual Studio中正常工作:

#include "stdafx.h"
#include <string.h>
#include <stdlib.h>


int main()
{
    int Age;
    char Name[50];

    printf("Type your age: ");
    if(scanf_s("%d", &Age))
    {
        printf("Your age is %d\n", Age);

        printf("Type your Name: ");
        if (scanf_s("%s", Name, (unsigned)_countof(Name)))
        {
            printf("Your name is %s\n", Name);
        }
        else
        {
            printf("Name:: Invalid Input\n");
        }
    }
    else
    {
        printf("Age:: Invalid Input\n");
    }

    return 0;
}

答案 1 :(得分:1)

问题是您将Name定义为char(单个字符),但是您试图将其用作字符串(多个字符)。

要解决此问题,您必须(a)将Name定义为字符(可能是字符串)的数组-例如char Name[100];或(b)指针(例如char *Name;)-要求您在使用前malloc()字符串,在使用后free()字符串。

字符串可能很棘手,因为它们基本上只是char的数组,但这要求您要么知道,要么找到一种方法来知道字符串中将包含多少个字符。您可以阅读有关如何进行此操作的here, in the documentation for scanf_s的更多信息,其中给出了以下示例:

char c[4];
scanf_s("%4c", &c, (unsigned)_countof(c)); // not null terminated

答案 2 :(得分:0)

首先,我只使用scanf(),而不使用scanf_s()。   此外,您需要将Name变量转换为字符串,这是一个字符数组,正如我在下面定义的那样。仅使用char Name表示您已经创建了一个仅包含一个字符的带有空格的变量。

希望这会有所帮助:)

 int main()
 {
     int Age;
     char Name[10];


     printf("Type your age: ");
     scanf("%d", &Age);
     printf("Your age is %d\n", Age);

     //Name

     printf("Type your Name: ");
     scanf("%s", &Name);
     printf("Your name is %s", Name);

     return 0;
}

答案 3 :(得分:0)

通过...解决了问题。

“工具”->“选项”->“调试”->“符号”,然后选中“ Microsoft符号服务器”复选框,Visual Studio将自动下载PDB。

感谢大家的帮助:)