我再也不能在这个混杂的错误上浪费一天了。你能帮忙吗?这是代码。有些细节可能会误入歧途,但是,在解决此错误之前,我无法进行编译。
int main(int argc, string argv[])
{
string note = argv[1];
int frequency(string note);
int duration(string fraction);
if (argc == 2)
{
// create new string with last 3 chars in string note
string fraction = note + strlen(note) - 3;
printf("(%.3s)\n", fraction);
// transform char into integer.. poof!
int x = atoi(&fraction[0]);
int y = atoi(&fraction[-1]);
// calculate integer from x & y values
duration = x * (8 / y);
printf("%i\n", duration);
}
else
{
printf("Two (2) arguments!\n");
return 1;
}
}
和错误消息..
duration.c:61:18: error: non-object type 'int (string)' (aka 'int (char *)') is not assignable
duration = x * (8 / y);
~~~~~~~~ ^
duration.c:62:24: error: format specifies type 'int' but the argument has type 'int (*)(string)' (aka 'int (*)(char *)') [-Werror,-Wformat]
printf("%i\n", duration);
答案 0 :(得分:2)
您已将duration
声明为函数,该函数接受一个string
(char *
)参数并返回一个int
:>
int duration(string fraction);
函数表达式确实不可分配-函数不能成为=
运算符的目标,因此
duration = x * (8 / y);
如果您希望duration
只是一个整数变量,请将其声明为
int duration;
<无偿之声>
string
标头中的cs50.h
typedef是一个错误,当考虑C语言中的字符串操作时,它会会使误入歧途。它使C语言中的字符串操作看起来比实际的更高级。
A string 是字符值的序列,后跟一个0值的终止符。字符串存储在char
的数组中。在大多数情况下,类型为“ T
的数组的表达式将被转换(“衰变”)为类型为“指向T
的指针”的表达式,因此,当我们处理字符串时,通常会处理类型为char *
的表达式,但是char *
不是字符串 。 char *
可以指向字符串中的第一个字符,或者可以指向不是字符串的序列中的第一个字符,或者可以指向单个字符不是更大序列的一部分。
C字符串操作极其很低。 string
typedef显然是对其中一部分进行抽象的尝试,但这充其量只是一个薄弱,漏水的抽象,而在最坏的情况下,它是积极学习C中适当的字符串处理技术的障碍。使用时请务必确实。
编辑
然后看起来您想要执行的操作是这样的:
/**
* Define the duration function to compute x * 8/y
*/
int duration( char *frac )
{
int x = atoi( frac );
int y = atoi( frac - 1 );
return x * (8 / y);
}
int main( int argc, char **argv )
{
// yadda yadda yadda
char *fraction = note + strlen(note) - 3;
printf("(%.3s)\n", fraction);
printf("%i\n", duration( fraction ) ); // call duration with
// fraction as an argument
// yadda yadda yadda
}