c-下/上转换中的分段错误



这是我的全部源代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("usage: %s l(ower)/u(pper)", argv[0]);
int (*convert)(int c) = NULL;
int c;
if (argc != 2)
printf("usage: %s l(ower)/u(pper)", argv[0]);
if (strcmp(argv[1], "l") == 0 || strcmp(argv[1], "lower") == 0)
convert = tolower;
else if(strcmp(argv[1], "u") == 0 || strcmp(argv[1], "upper") == 0)
convert = toupper;
else
printf("usage: %s l(ower)/u(pper)", argv[0]);
while ((c = getchar()) != EOF)
putchar((*convert)(c));
return 0;
}

我用cc编译了这段代码,并在MacBook上运行。接收到分段故障。

如果您运行的代码没有参数或参数不正确,printf语句会告诉您这一点,但程序会继续运行,因此您可能在调用'convert'函数指针时仍将其设置为NULL。在您看到消息告诉您没有给程序提供正确的参数之前,这将崩溃。您可能想在告诉您参数丢失或不正确的print语句之后放上"return 1"或其他什么。如果这样做,您需要将整个"If"或"else"子句放在括号中,否则返回语句将被无条件执行。您的缩进样式有点不标准。也许这就是为什么您忽略了这样一个事实,即在"printf"告诉您程序运行不正确之后没有"return"语句。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[])
{
printf("usage: %s l(ower)/u(pper)", argv[0]);
int (*convert)(int c) = NULL;
int c;
if (argc != 2) {
printf("uasge: %s l(ower)/u(pper)", argv[0]);
return 1;
}
if (strcmp(argv[1], "l") == 0 || strcmp(argv[1], "lower") == 0) {
convert = tolower;
} else if(strcmp(argv[1], "u") == 0 || strcmp(argv[1], "upper") == 0) {
convert = toupper;
} else {
printf("uasge: %s l(ower)/u(pper)", argv[0]);
return 1;
}
while ((c = getchar()) != EOF)
putchar((*convert)(c));
return 0;
}

您的代码中有几个问题,按顺序排列:

为什么在参数有效的情况下也要打印用法?第一个CCD_ 1必须被去除

在中

if (argc != 2)
printf("usage: %s l(ower)/u(pper)", argv[0]);

您可以检测参数的数量是否错误,但在这种情况下,您可以打印用法并继续,就像该数字正确一样。因此,如果您在没有参数的情况下调用程序,您将以NULL作为第一个参数调用strcmp,并使用未定义的行为

在中

else
printf("usage: %s l(ower)/u(pper)", argv[0]);

如果在else的情况下输入的参数不是l/lower/u或upper,但在其中打印用法并再次继续,就像没有错误一样,所以在这种情况下,convert


一种方法是:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[])
{
int (*convert)(int c) = NULL;
if (argc == 2) {
if (strcmp(argv[1], "l") == 0 || strcmp(argv[1], "lower") == 0)
convert = tolower;
else if(strcmp(argv[1], "u") == 0 || strcmp(argv[1], "upper") == 0)
convert = toupper;
}
if (convert == NULL)
printf("usage: %s l(ower)/u(pper)n", argv[0]);
else {
int c;
while ((c = getchar()) != EOF)
putchar(convert(c));
}
return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -g -Wall cv.c
pi@raspberrypi:/tmp $ ./a.out
uasge: ./a.out l(ower)/u(pper)
pi@raspberrypi:/tmp $ ./a.out a z
uasge: ./a.out l(ower)/u(pper)
pi@raspberrypi:/tmp $ ./a.out z
uasge: ./a.out l(ower)/u(pper)
pi@raspberrypi:/tmp $ ./a.out u
a
A
P
P
(
(

相关内容

  • 没有找到相关文章

最新更新