0

我已经构建了一个 C 应用程序,当我构建它时,它没有显示任何错误,但是当我运行它时,它给了我错误“Segmentation Fault: 11”。如果有帮助,这是我正在使用的代码:

#include <stdio.h>
int main(char *argv[]) {
printf("The project path is: ./Projects/%c", argv[1]);
return 0;
}
4

5 回答 5

3

正确的main原型语法是

int main(int argc, char *argv[]) { ... }

此外%c转换规范printf打印一个字符,打印一个字符串使用%s.

于 2012-04-10T09:39:48.277 回答
1

你有很多问题:

  • for 的签名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;
}
于 2012-04-10T09:43:05.090 回答
0
  1. 将签名更改为int main(int, char*[]);
  2. 您将哪些参数传递给流程?如果你没有通过任何argv[1]超出范围
于 2012-04-10T09:40:04.743 回答
0

首先,将您的主要更改为:

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]相同的方式可能会产生未定义的行为。

于 2012-04-10T09:40:25.350 回答
0

除了其他建议之外,您可能需要重新审视您的 printf 格式。%c用于打印单个字符,并且argv[1]char *. 使用argv[1][0]或类似的,或使用字符串格式说明符%s.

于 2012-04-10T09:42:22.510 回答