我已经构建了一个 C 应用程序,当我构建它时,它没有显示任何错误,但是当我运行它时,它给了我错误“Segmentation Fault: 11”。如果有帮助,这是我正在使用的代码:
#include <stdio.h>
int main(char *argv[]) {
printf("The project path is: ./Projects/%c", argv[1]);
return 0;
}
我已经构建了一个 C 应用程序,当我构建它时,它没有显示任何错误,但是当我运行它时,它给了我错误“Segmentation Fault: 11”。如果有帮助,这是我正在使用的代码:
#include <stdio.h>
int main(char *argv[]) {
printf("The project path is: ./Projects/%c", argv[1]);
return 0;
}
正确的main
原型语法是
int main(int argc, char *argv[]) { ... }
此外%c
转换规范printf
打印一个字符,打印一个字符串使用%s
.
你有很多问题:
main
是一个参数计数,后跟一个 C 字符串数组。%s
打印它们。这应该有效:
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2)
fprintf (stderr, "Wrong number of arguments\n");
else
printf ("The project path is: ./Projects/%s\n", argv[1]);
return 0;
}
int main(int, char*[]);
argv[1]
超出范围首先,将您的主要更改为:
int main(int argc, char *argv[])
其次,您传递给 printf 的内容与您告诉它您将要传递的内容不匹配。argv[1]
是指向字符的指针,而不是字符。您需要/想要使用 %s 转换将其打印出来:
printf("The project path is: ./Projects/%s", argv[1]);
在这种特定情况下,检查是否有足够的参数并不是必须的,因为即使您不传递任何命令行参数,argv
也至少会包含argv[0]
一个空指针。因此,使用argv[1]
是安全的,但如果您没有传递命令行参数,可能会打印为类似(null)
.
尽管如此,您通常希望argc
在使用之前检查 的值argv
。在这种情况下,您可以侥幸逃脱,但或多或少是偶然的。尝试使用argv[2]
相同的方式可能会产生未定义的行为。
除了其他建议之外,您可能需要重新审视您的 printf 格式。%c
用于打印单个字符,并且argv[1]
是char *
. 使用argv[1][0]
或类似的,或使用字符串格式说明符%s
.