我有这个密码:

#include <ctype.h>

char *tokenHolder[2500];

for(i = 0; tokenHolder[i] != NULL; ++i){

         if(isdigit(tokenHolder[i])){ printf("worked"); }

其中tokenHolder保存来自用户输入的char令牌的输入,用户输入已经通过getline和strtok进行了标记化当我试图在令牌持有者上使用isdigit时,我得到一个seg错误-我不确定为什么。

最佳答案

由于tokenHolderchar *的数组,因此当索引tokenHolder[i]时,您将向char *传递isdigit(),并且isdigit()不接受指针。
您可能缺少第二个循环,或者您需要:

if (isdigit(tokenHolder[i][0]))
    printf("working\n");

别忘了换行。
循环中的测试也很奇怪;通常将“空指针”拼写为0NULL而不是'\0';这只会误导人们。
另外,您还需要注意编译器警告不要发布带有警告的编译代码,或者(至少)指定警告是什么,这样人们就可以看到编译器在告诉你什么当编译器设置为fussy时,您的目标应该是零警告。
如果要测试标记数组中的值是否都是数字,则需要一个test_integer()函数,该函数尝试将字符串转换为数字,并让您知道转换是否不使用字符串中的所有数据(或者可能允许前导和尾随空格)。您的问题规范不清楚您正试图如何处理使用strtok()等找到的字符串标记。
至于为什么你会得到核心转储:
isdigit()宏的代码通常是
#define isdigit(x) (_Ctype[(x)+1]&_DIGIT)

当您提供一个指针时,它会被视为一个非常大的(正的或可能是负的)偏移量(通常是)257个值的数组,并且因为您访问的内存超出了界限,所以会出现分段错误。当EOFisdigit()时,+1允许将EOF传递给-1,这是通常的值,但不是必需的。像isdigit()这样的宏/函数将字符作为unsigned char-通常在0..255范围内,因此-或EOF作为有效输入。

关于c - Seg错误与C中的isdigit()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22084143/

10-12 04:28