【问题标题】:Passing string to a function in C - with or without pointers?将字符串传递给C中的函数 - 带或不带指针?
【发布时间】:2013-06-12 11:35:09
【问题描述】:

当我将字符串传递给函数时,有时我会使用

char *functionname(char *name[256])

有时我在没有指针的情况下使用它(例如:

char functionname(char name[256])

我的问题是,我什么时候需要使用指针?我经常编写没有指针的程序并且它可以工作,但有时它不会。

【问题讨论】:

  • “有时有效,有时无效”是什么意思?
  • 请不要让我们猜测。显示您的代码。足以让我们理解问题。
  • 对于第一种选择,参数是一个包含 256 个字符串的数组。至少如果你修复了标识符错误(名称中没有空格)
  • 不,因为它是第一个例子是语法错误:有一个额外的标识符。
  • 这里有一个很好的例子,说明如何在 C 语言中使用字符串和指针做不同的事情 stackoverflow.com/a/46344713/5842403

标签: c string function


【解决方案1】:

将 C 字符串传递给函数的公认约定是使用指针:

void function(char* name)

当函数修改字符串时,你也应该传入长度:

void function(char* name, size_t name_length)

你的第一个例子:

char *functionname(char *name[256])

传递一个指向字符串的指针数组,这根本不是你需要的。

你的第二个例子:

char functionname(char name[256])

传递一个字符数组。这里的数组大小无所谓,反正参数会衰减为指针,所以相当于:

char functionname(char *name)

有关 C 中数组参数的更多详细信息,另请参阅 this question

【讨论】:

  • 如果函数以这种方式接收字符串有什么危害吗:char functionname(char string[256])
  • void function(char* name) 因此仅在不修改 C 字符串时适用?声明它const 不是很有意义吗?对于大多数情况,您发送的指针也应该是 const,因为您不会更改指针本身?
  • char *functionname(char *string name[256]) 是语法错误,而不是“传递指针数组”。
  • 字符串实际存储在哪里?如果我们只做functionname("this is a string") 字符串将存储在哪里?我们确定它不会覆盖任何东西,因为我们没有给我们想要分配的空间指定长度。
【解决方案2】:

假设你打算写

char *functionname(char *string[256])

在这里,您声明了一个函数,该函数将一个包含 256 个指向 char 的指针的数组作为参数并返回一个指向 char 的指针。另一方面,这里,

char functionname(char string[256])

您正在声明一个函数,该函数接受一个包含 256 个chars 的数组作为参数并返回一个char

换句话说,第一个函数接受一个字符串数组并返回一个字符串,而第二个函数接受一个字符串并返回一个字符。

【讨论】:

    【解决方案3】:

    数组是一个指针。它指向一系列“对象”的开始。

    如果我们这样做:ìnt arr[10];,那么arr 是一个指向内存位置的指针,后面跟着十个整数。它们未初始化,但已分配内存。和int *arr = new int[10];完全一样。

    【讨论】:

    • #include #include void StringSort(char S[5][30]); void main() { 字符 S[5][30];诠释我; printf("Unesi 5 stringova:\n"); for(i = 0; i strlen(S[j])) { strcpy(pS, S [一世]); strcpy(S[i], S[j]); strcpy(S[j], pS); }
    • 数组不是指针。例如,sizeof(arr) 对于数组和指针是不同的。而new 是 C++,而不是 C。
    • @interjay,对不起。没有考虑到这一点。你当然可以使用 malloc() 代替。
    • #include #include #include char *fn(char *s1,char *s2); int main() { 字符 a1[20],a2[20]; printf("Unesi 字符串:");得到(a1); printf("Unesi drugi string:");得到(a2); printf("prvi po abecednom redu je %s",fn(a1,a2)); } char *fn(char *s1,char *s2) { if(strcmp(s1,s2)
    • 这两个程序都可以工作,但在一个程序中我没有使用指针,而在另一个程序中我使用了。看链接tny.cz/809ae075tny.cz/60dc68cf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2018-08-25
    • 2015-06-03
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多