为什么Null字符在scanf'd时不会加到字符串的结尾?

时间:2014-05-18 16:20:04

标签: c string strtok strlen

--start of snip--
char name[15];
...

printf("Enter employee name \n");
scanf("%s",name);

printf("strlen %d \n", strlen(name));
--end of snip --

Output:
Enter employee name
Veronica
8

为什么不在末尾添加空字符!我错过了什么吗?

请有人解释。

编辑:

使用fgets从已打开的文件中读取行并使用strtok(line,"\t ") 从行中获取令牌。

--snip--
char * chk;
char line[100];
char temp_name[15];
while(fgets(line, sizeof line, filep))
{
      chk = strtok(line, " \t");
      while(chk !-= NULL)
      {
           strcpy(temp_name, chk);
           chk = strtok(NULL, " \t");
      }
}
--snip --

问题:

我猜测由于strtok分隔符使用中的处理不当,额外的字符被添加到temp_name的末尾(而不仅仅是名称)。

溶液

if(!strncmp(temp_name, name, strlen(name))) // this is one fix

其他明智的使用

sscanf(line, "%s", temp_name); //easy fix

无论如何,我很困惑在strtok操作中是否存在NULL或额外字符的问题。

感谢您的回答。

此外,如果有人愿意帮助我在strtok使用什么分隔符以避免任何空格,制表符等。

3 个答案:

答案 0 :(得分:3)

添加了NUL终止符,但是strlen返回字符串的长度而没有NUL终结符。

答案 1 :(得分:2)

来自man 3 strlen

  

strlen()函数计算字符串s的长度,排除   终止空字节('\ 0')

答案 2 :(得分:0)

在那里,Null将被添加到scanf末尾的数组中。 strlen函数将为您提供字符数,直到NULL。在字符串长度计算期间不计算NULL