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 );
我是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 );