我试图让一个程序让用户输入一个单词或字符,存储它,然后打印它,直到用户再次键入它,退出程序.我的代码看起来像这样:
#include <stdio.h>
int main()
{
char input[40];
char check[40];
int i=0;
printf("Hello!\nPlease enter a word or character:\n");
gets(input);
printf("I will now repeat this until you type it back to me.\n");
while (check != input)
{
printf("%s\n", input);
gets(check);
}
printf("Good bye!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是我不断打印输入字符串,即使用户输入(检查)与原始(输入)匹配.我比较错误吗?
任何人都可以为我验证这个吗?JavaScript没有strcmp()的版本,所以你必须写出类似的东西:
( str1 < str2 ) ?
-1 :
( str1 > str2 ? 1 : 0 );
Run Code Online (Sandbox Code Playgroud) 我试图在x64计算机上编译这个程序:
#include <cstring>
int main(int argc, char* argv[])
{
return ::std::strcmp(argv[0],
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really …Run Code Online (Sandbox Code Playgroud) 我正在尝试strcasecmp用 C重新实现该函数,但我注意到比较过程中似乎存在不一致之处。
从 man strcmp
strcmp() 函数比较两个字符串 s1 和 s2。不考虑区域设置(有关区域设置的比较,请参阅 strcoll(3))。如果发现 s1 分别小于、匹配或大于 s2,则它返回一个小于、等于或大于零的整数。
从 man strcasecmp
strcasecmp() 函数对字符串 s1 和 s2 执行逐字节比较,忽略字符的大小写。如果发现 s1 分别小于、匹配或大于 s2,则它返回一个小于、等于或大于零的整数。
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
鉴于此信息,我不明白以下代码的结果:
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
} …Run Code Online (Sandbox Code Playgroud) strcmp当我注意到这一点时,我正在玩,这里是代码:
#include <string.h>
#include <stdio.h>
int main(){
//passing strings directly
printf("%d\n", strcmp("ahmad", "fatema"));
//passing strings as pointers
char *a= "ahmad";
char *b= "fatema";
printf("%d\n",strcmp(a,b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
-1
-5
Run Code Online (Sandbox Code Playgroud)
不应该strcmp一样吗?为什么,我给我传递一个字符串作为不同的值"ahmad"或作为char* a = "ahmad".将值传递给函数时,它们是否在其堆栈中分配?
我正在审查一些代码,我看到有人做了
if (0 == strcmp(foo,""))
Run Code Online (Sandbox Code Playgroud)
我很好奇,因为我认为这样做会更快
if (foo[0] == '\0')
Run Code Online (Sandbox Code Playgroud)
这是正确的还是strcmp足够优化,使它们相同.
(我意识到,即使存在一些差异,它也会很小,但我想通过使用我的方法保存至少一些指令.)
我为什么要来
lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
用单个字符串比较?我该如何解决这个问题C?
if (strcmp("hello", "hello") = 0)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我决定找到2个功能的速度:
这是我的xstrcmp函数:
int xstrlen(char *str)
{
int i;
for(i=0;;i++)
{
if(str[i]=='\0')
break;
}
return i;
}
int xstrcmp(char *str1, char *str2)
{
int i, k;
if(xstrlen(str1)!=xstrlen(str2))
return -1;
k=xstrlen(str1)-1;
for(i=0;i<=k;i++)
{
if(str1[i]!=str2[i])
return -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不想依赖strlen,因为我想要用户定义的所有内容.
所以,我找到了结果.strcmp每毫秒进行364次比较,而我的xstrcmp每毫秒只做20次比较(至少在我的电脑上!)
任何人都可以告诉为什么会这样吗?xstrcmp函数如何使自己如此之快?
我正在学习strcmp()C.我明白当两个字符串相等时,strcmp返回0.
但是,当strcmp第一个字符串小于第二个字符串时,手册页状态返回小于0时,它是指长度,ASCII值还是其他什么?
我写了一个函数,Str::Compare基本上是strcmp用另一种方式重写的.在比较这两个函数时,在循环中重复500'000'000次,strcmp执行速度太快,大约快x750倍.
此代码在C库中编译,-Os参数为active:
int Str::Compare(char* String_1, char* String_2)
{
char TempChar_1, TempChar_2;
do
{
TempChar_1 = *String_1++;
TempChar_2 = *String_2++;
} while(TempChar_1 && TempChar_1 == TempChar_2);
return TempChar_1 - TempChar_2;
}
Run Code Online (Sandbox Code Playgroud)
该函数的执行时间3.058s,而strcmp只0.004s.
为什么会这样?
这也是我实现基准测试循环的方式:
int main()
{
char Xx[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"},
Yy[] = {"huehuehuehuehuehuehuehuehuehuehuehuehuehue"};
for(int i = 0; i < 500000000; ++i)
Str::Compare(Xx, Yy);
}
Run Code Online (Sandbox Code Playgroud)
编辑:测试我编写的一些代码和优化,提高了Str::Compare速度.如果之前strcmp是x750倍,现在只有x250.这是新代码: …