我一直试图弄清楚我在这段代码中做错了一段时间但仍然没有运气。根据GDB,我收到了SIGSEV,Segmentation Fault,这意味着我试图访问无效的内存地址。
这里我试图找到传递的char指针的长度
int getLength(char *start) {
int count = 0;
while(*start) {
count++;
start++;
}
return count;
}
这是我的完整C档案。我认为它可能有用
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
int len1 = getLength(argv[1]);
int len2 = getLength(argv[2]);
if (argc != 3) {
fprintf(stderr, "Invalid number of items input.\n");
return 1;
}
if (len1!=len2) {
fprintf(stderr,"From and to are not the same size.\n");
return 1;
}
return 0;
}
int getLength(char *start) {
int count = 0;
while(*start) {
count++;
start++;
}
return count;
}
int duplicatesFrom(char *from) {
int i;
int j;
int len = getLength(from);
for(i=0;i<len;i++) {
for(j=0;j<len;j++) {
if (from[i]==from[j] && i!=j) {
return 1;
}
}
}
return 0;
}
答案 0 :(得分:1)
首先,如果你没有给你的程序至少提供3个参数,那么它会崩溃,因为你在getLength
的开头用第二个和第三个参数作为参数调用main()
。
我建议你将两个第一行移到参数计数检查之下。
然后,正如BathSheba所建议的那样,你应该考虑将char *
传递给getLength()
const
,因为getLength()
不会修改它。这是一个很好的做法,使代码更加不言自明。
此外,如果您的定义低于main()
,请不要忘记在main()
中使用的函数的前向声明,除非您将前向声明放在头文件中(代码中都没有)段)。
最后一件事:在getLength()
中,您应该通过执行char *
之类的操作来检查传递的if (start){...}
是否有效。因为如果start == NULL
,您的程序将崩溃,因为您将尝试访问空指针。
在您进行修改后:您无法将if()
语句与else if()
逻辑后跟其分开。此处else if()
可以更改为if()
,因为在您输入第一个if()
的情况下,您退出程序(return 1;
)。如果不这样做(如果有3个参数传递给该程序),您可以安全地检查argv[1]
和argv[2]
是否具有相同的长度。
你的主要,略有修改:
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Invalid number of items input.\n");
return 1;
}
int len1 = getLength(argv[1]);
int len2 = getLength(argv[2]);
if (len1 != len2) {
fprintf(stderr, "%s and %s are not the same size.\n", argv[1], argv[2]);
return 1;
}
else {
printf("%s", "Hello\n");
}
return 0;
}