我有以下程序,导致分段错误。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
printf("TEST");
for (int k=0; k<(strlen(argv[1])); k++)
{
if (!isalpha(argv[1])) {
printf("Enter only alphabets!");
return 1;
}
}
return 0;
}
我发现问题出在这一行
if (!isalpha(argv[1])) {
通过将 argv[1]
替换为 argv[1][k]
可以解决问题。
然而,我发现即使没有打印出 TEST
,程序也会导致分段错误,这让我感到相当好奇。 我还期望 isalpha
函数在检查 char*
指向的 argv [1]
的低字节时出现错误,但事实似乎并非如此。 为了简洁起见,我这里没有展示用于检查参数数量的代码。
这里发生了什么?
stdout
(即printf
写入的位置)默认情况下是行缓冲的。如果你不打印换行符,那么缓冲区将不会被清空。这就是为什么你应该总是用一个换行符来结束你的输出。 - Some programmer dude!isalpha(argv[1]
-->!isalpha(argv[1][k]
,因为您传递的是指针强制转换为整数而不是字符。 - 0___________