在MSVC++中,有一个函数strcmpi用于不区分大小写的C字符串比较.
当你尝试使用它时,它会,
从Visual C++ 2005开始,不推荐使用此POSIX函数.请改用ISO C++符合_stricmp.
我没有看到的是为什么ISO不希望MSVC++使用strcmpi,为什么_stricmp是首选方式,为什么他们懒得重命名函数,以及函数如何以下划线ISO符合开头.我知道所有这一切都有理由,我怀疑它是因为strcmpi是非标准的,也许ISO希望非标准扩展以_underscore开头?
我有以下内容:
int findPar(char* str)
{
int counter=0;
while (*str)
{
if(str[0] == "(") <---- Warning
{
counter++;
}
else if (str[0]== ")") <---- Warning
{
counter--;
}
if (counter<0)
{
return 0;
}
str++;
}
if (counter!=0)
{
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我得到的警告是int和char之间的比较.
我试着用strcmp做这样的比较(字符串中的第一个char和给定的char):
if (strcmp(str, ")")==0) { stuff }
Run Code Online (Sandbox Code Playgroud)
但即使比较(应该)正确,它也永远不会进入"东西".
我该怎么办?
在阅读字符串中的问题并将其与C进行比较时,不止一个人不鼓励使用strcmp(),说像
我也强烈建议你现在习惯使用strncmp(),以避免很多问题.
确保你使用strncmp而不是strcmp.strcmp非常不安全.
他们提到了什么问题?
之所以scanf()用绳子符和gets()强烈劝阻,是因为他们几乎不可避免地导致缓冲区溢出漏洞.但是,用缓冲区溢出是不可能的strcmp(),对吧?
"缓冲区溢出或缓冲区溢出是一种异常现象,程序在将数据写入缓冲区时会超出缓冲区的边界并覆盖相邻的内存."
( - 维基百科:缓冲区溢出).
由于strcmp()函数永远不会写入任何缓冲区,strcmp()函数不会导致缓冲区溢出,对吧?
人们不鼓励使用strcmp()和推荐的原因是什么strncmp()?
我试图实现strcmp:
int strCmp(char string1[], char string2[] )
{
int i=0,flag=0;
while(flag==0)
{
if (string1[i]>string2[i])
{
flag=1;
}
else if (string1[i]<string2[i])
{
flag=-1;
}
else
{
i++;
}
}
return flag;
}
Run Code Online (Sandbox Code Playgroud)
但我坚持用户将输入相同字符串的情况,因为该函数使用1和-1,但它不返回0.任何人都可以帮忙吗?请不要指点!
我试图检测 UITextfieldDelegate 内部的退格。并找到了这个答案。 /sf/answers/3450640931/
它工作正常。
但我不知道这个函数内部发生了什么。
let char = string.cString(using: String.Encoding.utf8)!
let isBackSpace = strcmp(char, "\\b")
if isBackSpace == -92 {
print("Backspace was pressed")
return false
}
Run Code Online (Sandbox Code Playgroud)
我知道退格的 ascii 代码是 int 类型的“8”,所以我认为上面的函数会像下面的代码一样。
// I thought this char would be "\b" of type char or 08 of type int
// but XCode give the value 0... I don't know why
let char = string.cString(using: String.Encoding.utf8)!
// as far as I know, strcmp …Run Code Online (Sandbox Code Playgroud) 出于专业的好奇心,比较C中两个完全数字字符串的最安全/最快/最有效的方法是什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char str1[5] = "123";
char str2[5] = "123";
char *ptr;
if(atoi(str1) == atoi(str2))
printf("Equal strings");
if(strtol(str1,&ptr,10) == strtol(str2,&ptr,10))
printf("Equal strings");
if(strcmp(str1,str2)==0)
printf("Equal strings");
return 0;
}
Run Code Online (Sandbox Code Playgroud) char s1[] = "0";
char s2[] = "9";
printf("%d\n", strcmp(s1, s2)); // Prints -9
printf("%d\n", strcmp("0", "9")); // Prints -1
Run Code Online (Sandbox Code Playgroud)
为什么strcmp在收到相同参数时会返回不同的值?
这些值仍然合法,因为strcmp的手册页说strcmp的返回值可以小于,大于或等于0,但我不明白为什么它们在这个例子中是不同的.
我了解,如果您在strcmp中有“ cat”(字符串1)和“ dog”(string2)(这是一个C问题),则strcmp的返回值将小于0(因为“ cat”在词法上小于“ dog” ')。
但是,如果发生这种情况,我不确定strcmp会发生什么:
string1: 'dog'
string2: 'dog2'.
Run Code Online (Sandbox Code Playgroud)
strcmp会返回什么?小于零,零或大于?对于上下文,我正在尝试编写一个比较器函数来比较字符串,并希望考虑以相同字符开头的字符串。一个字符串可能具有扩展名(例如上例中的“ dog2”中的“ 2”)。
编辑:这不是重复的问题。据称这与之类似的问题是询问返回类型代表什么-我是说,当字符串在某一点上相同之前,但其中一个停止,而另一个继续时,会发生什么。
我知道这可能是一个全新的问题(我很长一段时间没有接触过C),但有人可以告诉我为什么这不起作用吗?
printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
if (strcmp(buffer, "exit") == 0)
return 0;
Run Code Online (Sandbox Code Playgroud)
如果我输入"exit"它不会输入if,它是否与"buffer"的长度有关?
有什么建议?
我想我的代码可以完全正常使用strcmp或只是==在C++中比较2个char数组.任何人都可以证明使用的原因strcmp而不是==;