我已经构建了一个 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.