scanf 结束我的程序并且没有抛出错误

scanf ends my program and no error is thrown

我是C初学者,在处理scanf时遇到了问题,希望得到背后的解释

这是我的代码

#include <stdio.h>
#include <math.h>
#include <string.h>

int fav_charac() {
    char *string = ""; 
    printf("whats your fav letter?: ");
    scanf("%s", string);                         // the problem
    printf("your fav letter is %s\n", string);
}

int main() {
    fav_charac();
    return 0;
}

这是程序 运行

whats your fav letter?: a

C:\Users\DELL\source\repos\hello C\x64\Debug\hello C.exe (process 15052) exited with code -1073741819.
Press any key to close this window . . .

如您所见,它在输入后立即退出,为什么?

scanf 将尝试写入 string,即 .rodata。也就是说,string中的数据只能读取不能写入。使用 char string[64]; 或类似的东西。这会将变量放入 .data。还要用 scanf("%63s", string); 限制 scanf 中的用户输入,这样 scanf 就不会越界写入。

完整示例:

char string[64];
scanf("%63s", string);

试试这个:


 char string[50];  // [ the max of letters you want in your string ] 
    printf("whats your fav letter?: ");
    scanf("%s", string); 

在此声明中

char *string = "";

声明了一个指向空字符串文字的指针,它在内存中表示为一个字节,终止值为零 { '[=18=]' }

并且在这次通话中

scanf("%s", string); 

您正在尝试更改指针 string 指向的字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

来自 C 标准(6.4.5 字符串文字)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

因此,最好使用限定符 const.

声明指向字符串文字的指针
const char *string = "";

顺便说一句,在 C++ 中,与 C 字符串文字相反,字符串文字具有常量字符数组类型。所以对于 C++ 中的这样一个声明

char *string = "";

C++ 编译器将发出一条消息。

如果要输入多个字符,则声明一个字符数组,例如

char string[10] = "";

并使用 scanf

的以下调用
scanf( "%9s", string );

如果您只想输入一个字符,则声明一个 char 类型的对象,例如

char c = '[=16=]';

并使用 scanf

的以下调用
scanf( " %c", &c );