我试图将字符串与另一个字符串进行比较,如果匹配,我想要文本"这是正确的"输出,但我似乎无法使其正常工作。
以下是代码:
$borderSize = $_POST['borderSize'];
$sizeType = $_POST['sizeType'];
$borderStyle = $_POST['borderStyle'];
$basicText = $_POST['basicText'];
答案 0 :(得分:2)
在您的代码中,userInput指针没有用于保存您要使用scanf调用传递的字符串的规定。在尝试保存/分配任何字符串之前,需要为堆栈中的cstring userInput分配空间。所以......
您需要更改以下代码:
char * userInput;
为:
char userInput[200];
这里,200只是一个任意值。在您的情况下,请选择最大值。字符串的长度+ 1为(\ 0)。
答案 1 :(得分:1)
输入字符时,需要将字符存储在某处。
char* userInput;
是一个未初始化的指针。
首先,您为输入声明一个数组
char userInput[128];
现在从键盘读取时,你需要确保用户没有为\ 0输入超过127 +的字符,因为它会覆盖堆栈,所以从键盘读取的最佳方式是使用fgets,它也很好检查返回值,如果用户只需按下ENTER而不写任何内容,则fgets返回NULL。
if (fgets(userInput, sizeof(userInput), stdin) != NULL) {
现在您拥有用户输入的字符串以及行尾字符。要删除它,您可以执行类似
的操作 char* p = strchr(userInput,'\n');
if ( p != NULL ) *p = '\0';
现在你可以比较字符串
if (strcmp(password, userInput) == 0) {
puts("That is correct!");
}
答案 2 :(得分:0)
当你想到"一个字符串"在C中,您应该将其视为char
的数组。
为简洁起见,我请使用标识符s
代替userInput
:
0 1 2 3 4 5 9
+---+---+---+---+---+---+-- --+---+
s -> | p | i | p | p | o | \0| ... | |
+---+---+---+---+---+---+-- --+---+
是什么
char s[10] = "pippo";
会创建。
换句话说,它是一个内存块,其中前6个字节已经初始化,如图所示。在任何地方都没有s
变量。
相反,在
中声明char *
char *s;
会创建一个可以保存指向char
的变量:
+------------+
s| 0xCF024408 | <-- represent an address
+------------+
如果你这么想,你会立即注意到:
scanf("%s",s);
只在第一种情况下有意义,其中(希望)有足够的内存来保存字符串。
在第二种情况下,变量s
指向某个随机地址,您最终会将某些内容写入未知内存区域。
为了完整性,在以下情况下:
char *s = "pippo";
你在记忆中有以下情况:
0 1 2 3 4 5
+---+---+---+---+---+---+ Somewhere in the
0x0B320080 | p | i | p | p | o | \0| <-- readonly portion
+---+---+---+---+---+---+ of memory
+------------+ a variable pointing
s| 0x0B320080 | <-- to the address where
+------------+ the string is
您可以将s
指向其他位置,但不能更改s
指向的字符串的内容。