我正在尝试编写一个从字符串中提取多个字符并将其分配给另一个字符串的函数。
代码:
// Problem 10.4
// String extraction function
#include <stdio.h>
void substring (char source[], int start, int count, char result[])
{
int i;
for (i = 0; i <= count; ++i) {
result[i] = source[start];
}
result[i+1] = '\0';
}
int main (void)
{
void substring (char source[], int start, int count, char result[]);
char source[] = "character", result[80];
int start, count;
substring(source[], 4, 3, result[]);
printf("%s\n", result);
return 0;
}
Xcode告诉我该行
substring(source[], 4, 3, result[]);
是“期待一个表达”,它不会让我编译。
我很困惑,因为我的函数没有返回任何值(它在自己内部进行字符串赋值,因为它是一个字符串,这是不是意味着指针被传递给函数?在这种情况下不是那样的意味着字符串本身被修改而不是本地副本?如果原始字符串被修改,为什么我必须返回一个值?)
我不完全确定问题是什么,虽然我怀疑这与我在语法上没有将指针传递给我的函数这一事实有关。
提前感谢您提供的任何见解。
答案 0 :(得分:3)
这不是将数组传递给函数的方法。
您正在使用来源[]这不需要'[]'。
数组在C中作为引用传递。当你传递数组source [](fun(source))时,它的基地址将被传递给函数,就像指针一样。
substring(source, 4, 3, result);
此外,您的代码通过调用上述调用产生“aaaa”。你需要在循环中增加起始变量并且不要忘记索引从0开始,如果你的意思是start = 4,它从第5个字符'a'开始并导致“acte”。
代码:
// Problem 10.4
// String extraction function
#include <stdio.h>
void substring (char source[], int start, int count, char result[])
{
int i;
for (i = 0; i <= count; ++i) {
result[i] = source[start++];
}
result[i+1] = '\0';
}
int main (void)
{
void substring (char source[], int start, int count, char result[]);
char source[] = "character", result[80];
int start, count;
substring(source, 4, 3, result);
printf("%s\n", result);
return 0;
}
一切顺利......
答案 1 :(得分:1)
void substring (char source[], int start, int count, char result[])
{
int i;
// for (i = 0; i <= count; ++i) {
// result[i] = source[start];
for (i = 0; i < count; ++i) {
result[i] = source[start++];//start++ or start + i
}
// result[i+1] = '\0';
result[i] = '\0';
}
int main (void)
{
// void substring (char source[], int start, int count, char result[]);
char source[] = "character", result[80];
// int start, count;
// substring(source[], 4, 3, result[]);
substring(source, 4, 3, result);
printf("%s\n", result);
return 0;
}
答案 2 :(得分:0)
source[]
不是有效的表达式,它是数组的有效标识符声明,仅此而已。
您需要将正确的参数传递给函数,该函数的类型为char[]
:
substring(source, 4, 3, result);