C 从字符向量中读取有符号数字

C 从字符向量中读取有符号数字,c,fgets,negative-number,C,Fgets,Negative Number,我遇到了这个问题,我真的需要帮助,我非常感谢: 当我使用fgets()输入一个负数,然后尝试验证用户在fgets()读取的字符数组中输入的字符串是一个带有isdigit()的数字时,我总是得到正数,有没有办法读取负数。(我只需要读取数字,但可以使用scanf,因为当它读取字符时,会把我弄得一团糟) 下面是代码的一部分: char op[30]; int a[30]; int text_ssalto() { size_t len = strlen(op); fgets(op, s

我遇到了这个问题,我真的需要帮助,我非常感谢: 当我使用
fgets()
输入一个负数,然后尝试验证用户在
fgets()
读取的字符数组中输入的字符串是一个带有
isdigit()的数字时,我总是得到正数,有没有办法读取负数。(我只需要读取数字,但可以使用scanf,因为当它读取字符时,会把我弄得一团糟)

下面是代码的一部分:

char op[30];
int a[30];

int text_ssalto() {
    size_t len = strlen(op);
    fgets(op, sizeof(op), stdin);
    len = strlen(op);
    if (len > 0) {
        op[len - 1] = '\0';
    }

    if (isdigit(*op)) {
        sscanf(op, "%d", &a[x]);
    }

    return 0;
}

我想你的代码中可能有其他地方出错了,这里有一个与你的代码类似的示例,它正在工作。是否包含正确的标题

#include "ctype.h"
#include "stdlib.h"
#include "stdio.h"

int main ()
{
        char op[30];
        fgets(op, sizeof(op), stdin); /* input -11 */
        printf("%s\n", op); /* output -11 */
        if (isdigit(*op)) {
            printf("wrong\n"); // never got printed if input is negative
            sscanf(op, "%d", &a[x]); // read positive number     
        }
        else {
              sscanf(op + 1, "%d", &a[0]); // now a[0] has the positive part
              a[0] = -a[0]; // make it negative if you want.
        }

        return (0);
}
如果第一个字符是
“-”
,则不起作用

而不是使用

if (isdigit(*op)) {
    sscanf(op, "%d", &a[x]);
}
使用

该函数包含看似不必要的无关检查。可以简化为:

int text_ssalto() {
   fgets(op, sizeof(op), stdin);
   if ( sscanf(op, "%d", &a[x]) == 1)
   {
      // Got a number
      // Use it.
   }

   return 0;
}

是的,我已经包含了所有这些标题,但无法获取。我想您可以测试我的代码,看看它是否有效。我不认为另一个答案提到的第一个字符是数字。至少在我的机器上,它可以工作。是的,它可以工作,但当我在if条件后尝试打印时,它会打印一个正数。当我打印a[x]时,我认为
isdigit()
不会存储
-
因为它不是一个数字如果
isdigit(*op)
的测试失败,代码永远不会进入if语句的内部。我不知道你想做什么。
if ( sscanf(op, "%d", &a[x]) == 1 )
{
   // Got a number.
   // Use it.
}
int text_ssalto() {
   fgets(op, sizeof(op), stdin);
   if ( sscanf(op, "%d", &a[x]) == 1)
   {
      // Got a number
      // Use it.
   }

   return 0;
}