[英]Counting the Whole String Including The Spaces in C
我正在尝试设置一个计算整个字符串的代码,并且在它找到的第一个空格之后不会停止。 我怎么做?
我试过这种代码,但它只计算第一个单词,然后显示第一个单词中的字母数。
到目前为止,这是我尝试过的。
int main(){
char get[100];
int i, space=0, len=0, tot;
scanf("%s", get);
for (i=0; get[i]!='\0'; i++)
{
if (get[i] == ' ')
space++;
else
len++;
}
tot = space + len;
printf("%i", tot);
}
和
int main(){
char get[100];
int len;
scanf("%s", &get);
len = strlen(get);
printf("%i", len);
}
但仍然会得到与第一个相同的答案。
我预计如果输入:狐狸是华丽的。 输出:19
但我得到的只是输入:狐狸很漂亮。 输出:3
strlen
已经包含空格,因为它计算字符串的长度,直到终止NUL字符(零, '\\0'
)为止。
您的问题是,当scanf
的%s
转换遇到空格时,它会停止读取,因此您的字符串永远不会一开始就包含它(您可以通过打印出字符串来轻松地进行验证)。 (您可以通过使用不同的scanf
转换来修复它,但通常,通过使用fgets
读取可以更轻松地完成操作-它还会强制您指定缓冲区大小,从而修复当前代码中潜在的缓冲区溢出。)
Arkku的答案在诊断中是正确的。 但是,如果您希望使用scanf,则可以执行以下操作:
scanf("%99[^\n]", get);
99
告诉scanf读取的字符不能超过99个,因此您的get
缓冲区不会溢出。 [^\\n]
告诉scanf读取任何字符,直到遇到换行符为止(按回车键时)。
正如Chux指出的那样,该代码仍然存在2个问题。
使用scanf时,最好检查它的返回值,这是它可以读取的项目数。 同样,使用上述语法时, \\n
实际上仍保留在输入缓冲区中。 因此,您可以这样做:
if(scanf("%99[^\n]", get) == 0){
get[0] = 0; //Put in a NUL terminator if scanf read nothing
}
getchar(); //Remove the newline character from the input buffer
我将举一个例子来解释这个概念。
main()
{
char s[20], i;
scanf("%[^\n]", &s);
while(s[i] != '\0') {
i++;
}
printf("%d", i);
return 0;
}
我用过 c 语言,你可以遍历字符串的结尾部分,你会得到长度。 这里我使用了“EDIT SET CONVESRION METHOD”来读取字符串,您也可以读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.