为什么我不能得到整个字符串的长度?

时间:2014-03-16 05:24:13

标签: c string strlen

我试过strlen(字符串)。我尝试编写代码来查找整个字符串的长度。然而,当达到第一个“空间”时,它仍然倾向于停止计算长度。为什么会这样?解决办法是什么?我试图停在'\ 0'。这不应该工作吗?这是代码的一部分。

int main(void) {
char phrase[256];
char phrase2[256];
int i,j,size;
scanf("%255s", phrase);
for(i=0;phrase[i]!='\0';i++){
    size++;
}
...

6 个答案:

答案 0 :(得分:4)

它停止计数的原因是因为scanf一次读取一个字。它读了第一个单词然后停止,忽略了其余部分。

相反,请使用fgets

  

从流中读取字符并将它们作为C字符串存储到str中   直到(num-1)个字符被读取或者是换行符或者   达到文件结尾,以先到者为准。

您可以阅读标准输入,如下所示:

fgets(phrase, 256, stdin);

您是否考虑过使用strlen来衡量输入的长度?

最后,你应该养成在声明变量时初始化变量的习惯:

int i = 0,j = 0, size = 0;

当声明变量时,其值为“内存中的任何内容”,直到设置其值为止。在你的例子中,长度为'从未初始化,这将导致意外的行为。初始化变量是避免意外行为和浪费时间追踪错误的好方法。

答案 1 :(得分:1)

  

但是,当达到第一个“空格”时,它仍然会停止计算长度。

嗯,这是scanf的默认行为。您可以使用fgets来解决问题。另外,添加备注size不是已初始化

答案 2 :(得分:1)

Scanf() function 

不占用空格。 无论何时出现空间,它都会将其视为输入的结尾,并将'\ 0'置于该位置。

你可以做一件事:

scanf("%[^\n]s",phrase);

此scanf将接受输入,直到发生换行,即按下输入:)

在您的代码中,重要的是,您尚未将大小初始化为0。

以下是解决方案:

int main(void) 
{
    char phrase[256];
    char phrase2[256];
    int i,j,size=0;    //initialize size
    scanf("%[^\n]s",phrase);   //input taken till '\n'
    for(i=0;phrase[i]!='\0';i++)
    {
        size++;
    }
}

答案 3 :(得分:0)

sscanf停在第一个空格字符处。以下是man scanf关于字段宽度说明符的代码段。

  

可选的十进制整数,指定最大字段宽度。当达到此最大值或找到不匹配的字符时(以先发生者为准),读取字符会停止。

如果您想阅读整行,请使用fgets

fgets(phrase, 255, stdin);

答案 4 :(得分:0)

%s消耗单词(由一个或多个空格分隔), 您可以使用消耗字符的%c。

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

int main(void) {
  char phrase[256];
  int size;
  scanf("%255c", phrase);
  size = strlen(phrase) - 1; /* -1 is for EOL */
  printf("length is %d\n", size);
}

答案 5 :(得分:-1)

scanf()函数一次只能读取一个单词。您可以将代码更改为

scanf("%255[\n]s",phrase);