“的等价物是什么?”;尺寸“t”;在C中?

“的等价物是什么?”;尺寸“t”;在C中?,c,arrays,memory,C,Arrays,Memory,假设我想做一个函数,比如 int indexOf ( char * str, char c ) { // returns the index of the chracter c in the string str // returns -1 if c is not a character of str int k = 0; while (*str) { if (*str == c) break; else ++str; } retu

假设我想做一个函数,比如

int indexOf ( char * str, char c )
{
   // returns the index of the chracter c in the string str 
   // returns -1 if c is not a character of str
  int k = 0;  
  while (*str)
  { 
      if (*str == c) break;
      else ++str;
  }
  return *str ? k : -1;  
}
但我想让它尽可能可靠。例如,仅当保证最大
int
大于或等于字符数组的最大大小时,上述方法才有效。如何用纯C语言覆盖所有的基础?

使用指针

您将始终能够返回指向数组中有效元素的指针。未找到的条件通过返回NULL来表示。

使用指针

您将始终能够返回指向数组中有效元素的指针。未找到的条件通过返回NULL来表示。

不,说真的<代码>大小\u t是标准的C类型。它在
中定义

(这就是“C中的“大小”的等价物是什么?”)

对于您编写的确切函数,
strchr
更合适-调用者可以这样使用它:

const char* str = "Find me!find mE";
char* pos = strchr(str, '!');
if(pos) // found the char
{
    size_t index = (pos - str); // get the index
    // do the other things
}
else
{
    // char not found
}
所以,一般来说,如果您想在用户提供的数组中找到一些东西,返回指针在C语言中是最常用的

您可以返回
ssize\u t
(其中包括
size\u t
-1
的所有可能值),但它不是标准的C,因此我不建议使用它。我提到它只是为了完整。

不,说真的<代码>大小\u t是标准的C类型。它在
中定义

(这就是“C中的“大小”的等价物是什么?”)

对于您编写的确切函数,
strchr
更合适-调用者可以这样使用它:

const char* str = "Find me!find mE";
char* pos = strchr(str, '!');
if(pos) // found the char
{
    size_t index = (pos - str); // get the index
    // do the other things
}
else
{
    // char not found
}
所以,一般来说,如果您想在用户提供的数组中找到一些东西,返回指针在C语言中是最常用的


您可以返回
ssize\u t
(其中包括
size\u t
-1
的所有可能值),但它不是标准的C,因此我不建议使用它。我提到它只是为了完整。

将您的问题解释为:

指针算法如何不依赖索引大小?

答案是:

int indexOf ( char * str, char c )
{
    // returns the index of the chracter c in the string str 
    // returns -1 if c is not a character of str
    char *aux = str;  
    while (*aux != c )
    { 
        if (*aux == '\0')
            return -1;
        aux++;
    }
    return aux - str; 
}

将你的问题解释为:

指针算法如何不依赖索引大小?

答案是:

int indexOf ( char * str, char c )
{
    // returns the index of the chracter c in the string str 
    // returns -1 if c is not a character of str
    char *aux = str;  
    while (*aux != c )
    { 
        if (*aux == '\0')
            return -1;
        aux++;
    }
    return aux - str; 
}


C99标准中存在大小,您说“纯C”是什么意思?您是否应该在该循环中递增
k
?确切的意思是“例如,如果保证最大int大于或等于字符数组的最大大小,则上述方法才有效”?我试图理解这个问题。@Shondeslich的意思是,如果C99标准中存在
INT\u MAX>=strlen(str)
size\t,那么你说“纯C”是什么意思?你应该在循环中增加
k
?确切的意思是什么“例如,仅当保证最大int大于或等于字符数组的最大大小时,上述方法才有效”?我试图理解这个问题。@shondeslich他的意思是如果
int\u MAX>=strlen(str)
为什么要否决?这是在C中执行
strchr
的正确方法,没有问题。为什么要否决?这是在C中执行
strchr
的正确方法,没有问题。我想OP会好奇如何处理
return-1
部分代码。OP知道大小。\u不存在。但是你的答案不存在t显示如何返回-1或等效值。@2501我认为问题只需要知道字符是否在字符串和索引中。如果返回值与-1不同,而您知道哪一个是确认所需内容的返回值就可以了。(但是,您是正确的)我想OP会很好奇如何处理他的部分代码
return-1
。OP知道存在的大小。但是你的答案没有显示如何返回-1或等效值。@2501我想问题只需要知道字符是否在字符串和索引中。如果返回值不同于-1,而你知道哪个是ret确认所需内容的urn是可以的。(但是,您是正确的)如果是另一种类型,除法无论如何都是错误的。
ptr+1
指向下一个元素,而不是下一个字节。你是对的,我认为两个指针之间的操作会忽略类型大小。如果是另一种类型,除法无论如何都是错误的。
ptr+1
指向下一个元素,而不是下一个字节。你是对的对,我认为两个指针之间的操作会忽略类型大小。