我在目前正在研究的代码中找到了这个,有人可以向我解释。
char * string = "Simulated Annealing = 12847369";
char * value = strchr(string, '=');
*(value ++ ) = 0;
printf("%s ==== %s", value, string);
我注意到字符串首先会以新行打印,为什么会这样?
char* karmarkar = "Karmarkar 958572";
我想使用strchr在字符串karmarkar中找到第一个出现的“space”。 我该怎么做?
答案 0 :(得分: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。