我试过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++;
}
...
答案 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);