我打破了C编译器吗?

时间:2018-01-11 17:26:58

标签: c string

任何人都可以解释为什么这会分散char schar poooooop吗? 这似乎不应该使用两个分隔符..这是一个错误还是我做了一些根本错误的事情? 使用GCC编译器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(){
   char str[80] = "something:27393 somethingElse:11 info:3";
   const char s[1] = " ";

   char* token;
   char* nextToken;

   /* get the first token */
   token = strtok(str, s);
   const char poooooop[1] = ":";

   printf("%s\n", poooooop);
   printf("%s\n", s);
   /* walk through other tokens */
   while( token != NULL ) {
      printf( " %s\n", token );
      token = strtok(NULL, s);
   }

   return(0);

}

2 个答案:

答案 0 :(得分:4)

strtok的第二个参数必须是指向字符串的指针。您的s

token = strtok(str, s);

代表const char *指针,它不是指向字符串的指针。行为未定义。您观察到的奇怪行为只是未定义行为的一种表现。

字符串定义为以零结尾的字符序列。您的s不是以零终止的字符序列。它是一个包含单个空格字符的数组。在s的声明中,由于" "数组的大小不足,s字面值中存在的零终结符字符“丢失”。标准C语言允许这种情况发生。

如果您希望该数组包含零终结符,则必须使用大小为2(至少)声明它

const char s[2] = " ";

或只是

const char s[] = " ";

const char *s = " ";

正如评论中所建议的那样。

P.S。这同样适用于您的poooooop数组。

答案 1 :(得分:0)

您错误地设置了字符串。

  const char s[1] = " ";

应该是

  const char *s = " ";

令人惊讶的是编译器没有抱怨。