[英]How to find string length in C without strlen() or searching for NULL terminator
[英]Find length of string in C (without using strlen)
下面的代码不打印任何东西 -
int main() {
char *input = "This is a string";
find_length(input);
return 0;
}
void find_length(char *input){
printf("%s", input);
int length = 0;
while(input[length]!='\0');
{
length++;
printf("%i", length);
}
}
你的循环后面有一个额外的分号:
while(input[length]!='\0');
^ does not belong here!!!
所以它陷入了无限循环。 摆脱它。
此外,可能存在流缓冲。 尝试添加一些\\n
。 或者调用fflush(stdout)
来刷新输出流。
void find_length(char *input){
printf("%s\n", input);
int length = 0;
while(input[length]!='\0') // remove ;
{
length++;
printf("%i\n", length);
}
}
是的,它确实如此,但由于它不打印换行符,因此在程序退出之前缓冲区不会被刷新,并且您最终会在同一行上看到 shell 提示。 有些人有带回车的 shell 提示,这会覆盖程序输出。
改变这个:
printf("...", ...);
对此:
printf("...\n", ...);
以下是解决办法。
#include <stdio.h>
int main()
{
char str[100];
printf("Enter a string: ");
printf( "\rLength is: %d", printf("Entered string is: %s\n", gets(str)) - 20);
return 0;
}
在上面的程序中,gets() 返回输入的字符串。 我们使用第一个 printf 打印长度。 第二个 printf() 调用gets() 并使用gets() 的返回值打印输入的字符串,它还打印20 个额外的字符用于打印“输入的字符串是:”和“\\n”。 这就是为什么我们从第二个 printf 的返回值中减去 20 并得到长度的原因。
如果您使用for(int i=0; str[i];i++)
,只要字符数组中的元素为 true 而不是'\\0'
此循环也会运行。 您可以将其计数到'\\0
。 在下面的代码中,您可以看到与while
循环相同的内容,但是当您返回时,您应该执行-1
因为当循环遇到'\\0'
它会终止,但它还会添加1
。 如果这让您感到困惑,您可以使用与for(length=0; ch[length];length++);
相同的逻辑for(length=0; ch[length];length++);
那么你不必做-1
;
#include <stdio.h>
int strlength(char ch[]){
int length =0;
while(ch[length++]);
return length-1;
}
int main(){
char ch[20];
scanf("%s", ch);
// printf("%s", ch);
printf("%i\n",strlength(ch));
return 0;
}
查找给定字符串长度的简单方法
int strLength(const char *_array)
{
int str_len=0;
while(*(_array++))
str_len++;
return str_len;
}
这是您的答案:(len 将是字符串的长度,字符串是字符串!)
int len;
for(len=0; string[len]!='\0'; len++);
printf("Length of string is %i", len);
问题很老,但是......为什么你要费心创建一个循环来获取字符串的长度,因为printf
已经可以通过说明符%n
做到这一点了:
#include <stdio.h>
int main(int argc, char* argv[])
{
char *input = "This is a string";
int length=0;
printf("%s%n",input,&length);
printf("\nThe length of \"%s\" is %d",input, length);
return 0;
}
或者您甚至可以在打印这样的字符串后获得printf
函数的输出:
length=printf("%s",input);
printf("\nThe length of \"%s\" is %d",input, length);
C++, Count string without functions
#include <iostream>
#include <string>
using namespace std;
int main()
{
string leng;
cout << "Enter String for Count" << endl;
cin >> leng;
int a = 0;
while (leng[a++]);
{
cout << a;
}
}
您可以使用strlen
源代码代替strlen
Gnu C Compiler - GLIBC
#include <string.h>
size_t strlen (const char *str)
{
int cnt;
asm("cld\n" /* Search forward. */
/* Some old versions of gas need `repne' instead of `repnz'. */
"repnz\n" /* Look for a zero byte. */
"scasb" /* %0, %1, %3 */ :
"=c" (cnt) : "D" (str), "0" (-1), "a" (0));
return -2 - cnt;
}
注意asm
用于在 C 源代码中插入程序集(也可能是__asm__
)
我认为这就足够了:
sizeof(my_string)/sizeof(char)
增加length
变量或删除分号到 while 循环。
尝试,
void find_length(char *input){
int length = 0; /* declaration */
printf("%s", input);
while(input[length++]!='\0');
printf("%i", length);
}
/* OR */
void find_length(char *input){
int length = 0;
while(input[length]!='\0')
{
length++;
}
printf("%i", length);
}
我想其他帖子会为您指出正确的答案。
但我只想在这里留下一张纸条。 如果find_length()
返回字符串的长度( size_t
或者它也可以是int
)而不是void
会很好
OTOH,您可以查看strlen()
的各种其他实现。 希望能帮助到你!
#include <stdio.h>
// array version
int strlen1(char a[])
{
int len = 0;
while (a[len])
len++;
return len;
}
// pointer version
// *p++ = dereference the pointer value and then
// increment the pointer to the next memory location
int strlen2(char *p)
{
int len = 0;
while (*p++)
len++;
return len;
/*
int *q = p;
while (*p);
p++;
return p-q;
*/
}
int main()
{
char s[] = "test string";
char *p = "another string";
printf("strlen1(%s) = %d \n", s, strlen1(s));
printf("strlen1(%s) = %d \n", p, strlen1(p));
printf("strlen2(%s) = %d \n", s, strlen2(s));
printf("strlen2(%s) = %d \n", p, strlen2(p));
return 0;
}
main(int argc, char *argv[])
{
char *input = "Enter Any string";
printf("your Entered String is: %s\n", input);
int length = 0;
while (input[length] != '\0') {
length++;
}
printf("length is : %i\n", length);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.