通过字符串搜索来学习C.

时间:2011-05-14 11:16:01

标签: c

我在目前正在研究的代码中找到了这个,有人可以向我解释。

char * string = "Simulated Annealing = 12847369";
char * value = strchr(string, '=');

*(value ++ ) = 0;


printf("%s ==== %s", value, string);

我注意到字符串首先会以新行打印,为什么会这样?

char* karmarkar = "Karmarkar   958572";

我想使用strchr在字符串karmarkar中找到第一个出现的“space”。 我该怎么做?

4 个答案:

答案 0 :(得分:2)

  1. 不,它没有添加新行http://codepad.org/xhTiV4Qn。实际上在我的机器上它提供了sigsegv,因为你试图在“模拟......”内的只读位置写入。
  2. int pos = strchr(karmarkar, ' ') - karmarkar;strchr(karmarkar, ' ')返回指向第一个“”(空格)的指针。

答案 1 :(得分:1)

代码首先计算'='字符的位置(作为地址,而不是索引)。然后将此地址处的字符设置为0,并将值的地址设置为下一个符号。这使得“string”在'='之前结束(现在是0),因为它终止于0并且值在'='之后开始。因此printf将打印出“12847369 ==== Simulated Annealing”(注意空格仍在那里)。

对于你的第二个问题,它的作用相似,正如亚历山德鲁在他的回答中指出的那样。

答案 2 :(得分:1)

首先

您可以将string定义为指向一个常量字符串文字,该文字存储在只读存储器中:

char * string = "Simulated Annealing = 12847369";

然后你会在这个字符串中找到=的第一个匹配项,并将指针放在value中:

char * value = strchr(string, '=');

所以value现在指向只读内存或value = NULL,所以这是一行具有未定义的行为:

*(value ++ ) = 0; // assign value to read-only memory

如果让我们说你写了

char string[] = "Simulated Annealing = 12847369";

您将此字符串存储在堆栈中的数组中,然后您可以写入它。

现在,问题

您的代码不会将其打印到新行,如果您之前写过任何内容,您会看到:

char string[] = "Simulated Annealing = 12847369";
char * value = strchr(string, '=');
*(value ++ ) = 0;
printf("First line");
printf("%s ==== %s", value, string);

要查找空格字符的第一个匹配项,请使用strchar(karmarkar, ' '):

再一次,当你使用strchr时检查返回值是否为NULL,因为它可能是,如果它确实是NULL,那么你的程序可能会崩溃。 (取消引用非法地址)

答案 3 :(得分:0)

在第一种情况下,strchr将返回指向string中找到'='的字节的指针。您不需要将0附加到返回的值,因为它只是指向string指向的字符数组的另一个指针,它已经以空终止。要打印角色,只需说出value[0]

char* string = "Simulated Annealing = 12847369";
char* value = strchr(string, '=');
if (value != NULL)
  {
    printf("value: %s, string: %s\n", value, string);
    printf("char: %c\n", value[0]); /* prints = */
  }

在第二个字符串中找到一个空格:

char* karmarkar = "Karmarkar   958572";
value = strchr(karmarkar, ' ');
if (value != NULL)
  printf("value: %s\n", value);

在使用之前,请务必检查strchr的返回值,因为如果找不到该字符,它将返回NULL。

BTW,语句*(value ++) = 0在尝试修改只读位置时应该导致段错误。如果你在一本声称教授C的书中找到了这个代码,我建议你放弃它并开始学习this。如果编译器生成的代码为该特定语句打印换行符,则应该开始使用更好的编译器。有一些好的available for free download