在C语言中将字符串传递给函数

3
下面的代码将文件内容读入缓冲区,然后对其进行某些操作。
char *getData(){
    char *buf = (char*) malloc(100);
    //write file contents to buf
    return buf;
}

char *bar(char *buf){
    //do something with buf
    return buf;
}

int main(void){
    char *result;

    result = bar(getData());

    return 0;
}

第9行的return buf;可以正常工作 - 它返回整个字符串。问题是如何在函数bar中访问buf中的单个字符?

1
第8行://对buf执行某些操作 - pmg
6个回答

7
如果您想访问单个字符,可以像在其他任何地方的任何字符串一样进行操作:buf[index](对于指针,ptr[index]*(ptr+index)完全相同)。
顺便说一下,在该代码中有一个malloc但没有相应的free - 您正在泄漏内存。在这样一个小程序中,问题不明显(应用程序立即终止,因此所有仍未分配的内存都会自动被操作系统回收),但在大型程序中,问题可能会变得严重。

而且相反地,index [ptr] 与 *(index + ptr)相同,因此它们也执行相同的操作! - Flexo
@awoodland:是的,这是一个奇怪但又合乎逻辑的行为,它会定期在SO上被提及。我没有引用它是为了避免让OP更加困惑。 :) - Matteo Italia

2

您可以进行索引。

if (buf != NULL) {
    int i = 0;
    while (buf[i] != '\0') {
        // Do Processing
        ++i;
    }
}

2
作为一个字符串数组,char * 应该使用索引器 buf[index] 来操作它...

1
也许我没有理解你的问题,但是乍一看,我会说你只需要使用数组访问:
char *bar(char *buf)
{
  char newFifthCharacter = 'X';
  buf[4] = newFifthCharacter;
  return buf;
}

请注意,您需要有一种方法进行边界检查,以便您不会在数组末尾之外写入。您可以在bar中使用strlen函数,也可以使用包含长度的整数参数。传递长度可能是更好的实践。

1

buf[i](或者 *(buf + i))是 buf 中的第 i 个字符。


1

你可以将字符串(char*)视为char数组:

 char x = buf[0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接