在C中比较字符串的问题

时间:2016-11-29 21:38:01

标签: c arrays string

我试图将字符串与另一个字符串进行比较,如果匹配,我想要文本"这是正确的"输出,但我似乎无法使其正常工作。

以下是代码:

$borderSize = $_POST['borderSize'];
$sizeType = $_POST['sizeType'];
$borderStyle = $_POST['borderStyle'];
$basicText = $_POST['basicText'];

3 个答案:

答案 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指向的字符串的内容。