通过scanf检测数据类型+在其他函数中使用它

时间:2015-11-01 17:12:54

标签: c

所以我对C来说比较新,我正在尝试一些初学者课程。其中一个是从stdin读取用户输入的程序(通过使用scanf)。

我会逐步解释所有内容,以便更容易理解我的意图(尽管这部分代码功能/可操作且不需要任何特定的帮助。所以如果你愿意,你可以直接跳到下面的问题)

所以我们有一个程序从scanf()读取输入并决定它的编号或字符串。

#include <stdio.h>
int isNumber(const char *input){
 /* while not end of string */
 while (*input != '\0'){
/* if we do not detect a number, return 0 */
  if (*input < '0' || '9' < *input)
   return 0;
 input++;
  }
return 1;
}

int main(void){
char uInput[30];

/*Ask user for input */
printf("Please enter number or word \n");
scanf("%29s", uInput);

if (isNumber(uInput)){
 printf("We found a number %s \n", uInput);
}

else {
 printf("We found a word %s \n", uInput);
}

return 0;
}

所以是的,到目前为止,该计划是如此有效。希望一切都清楚。现在我知道这不是最佳的检测方式,但目前并不关心。

问题从这里开始:

现在我决定通过增加另一个功能来增加一些东西 更具体地说,它涉及素数。

所以我开始使用

的功能
int prime(int number){
 int divider;

 for (divider = 2; divider <= number - 1; divider++){

  if (number%divider == 0)
  return 0;


  else if (number == divider)
  return 1;
 }
}

在假设中,我的函数中的所有内容都是正确的,我决定在main()函数中初始化函数。

基本上我想做的事情:

如果用户输入是单词 - 打印出单词 如果用户输入是一个数字 - 检查数字是否为素数,然后打印出数字以及它是否为素数。

以下是我改变代码的方法:

int main (void){
 char uInput[30];
 int result;


 /*User input goes here*/
 printf("Please enter a number or a word \n");
 scanf("%29s", uInput);

/* if it contains any numbers do */
if(isNumber(uInput)){
result = prime(uInput);

  /* now I've created another if condition, if it is a prime number */
  if(result == 1){
   printf("It is a prime number: %d \n", uInput);
  } else {
   printf("It is a number: %d \n", uInput);

}
else {
printf("It is a word %s \n", uInput);
}

return 0;
}

怀疑:现在我99%确定此代码中存在错误(而不仅仅是语法错误)。我甚至可能知道它在哪里,但由于我缺乏知识,我不确定如何解决它。

因此,当我正在使用素数函数时,我不确定是否应该将其作为字符串或整数的结果。问题是,我的程序通过单词作为字符串运行,即使它是一个数字,从技术上来说,它仍然是一个错误的字符串,它是一个数字&#39;。

问题是,我不确定如何比较素数,它不是整数而是字符串。所以我在我的printf上将%s更改为%d。我认为必须有某种形式的转换,我不知道。

但没有成功。目前,单词检测有效,但当我输入例如2时,我的输出结果为

  

&#34;我通过console&#34;

在scanf()中输入2      
    

这是一个号码2686752

  

期望的结果将是

  
    

这是一个素数:2

  

(这也意味着通过演绎,它甚至不会使用第一个if并跳过其他,因为如果它是一个素数,它的printf是不同的。所以我可能有问题&#34;素数&#34;也起作用。

问题是,我不能使用scanf(%d,uInput),否则字符串检测不起作用,显然我的解决方案也不正确。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

首先,您的prime功能存在问题。检查(number == divider)是否错误。您只需删除else if部分,如下所示。

int prime(int number){
 int divider;

 for (divider = 2; divider <= number - 1; divider++){
  if (number%divider == 0)
   return 0;
 }
 return 1;
}

下一期是您从uInput获取号码的方式。您可以使用atoi进行此操作,如下所示

if(isNumber(uInput)){
result = prime(atoi(uInput));

  /* now I've created another if condition, if it is a prime number */
  if(result == 1){
   printf("It is a prime number: %s \n", uInput);
  } else {
   printf("It is a number: %s \n", uInput);

}
else {
printf("It is a word %s \n", uInput);
}

完整代码如下

#include <stdio.h>
#include <stdlib.h>
int isNumber(const char *input){
 /* while not end of string */
 while (*input != '\0'){
/* if we do not detect a number, return 0 */
  if (*input < '0' || '9' < *input)
   return 0;
 input++;
  }
return 1;
}

int prime(int number){
 int divider;

 for (divider = 2; divider <= number - 1; divider++){

  if (number%divider == 0)
  return 0;
 }

 return 1;
}

int main (void){
 char uInput[30];
 int result;


 /*User input goes here*/
 printf("Please enter a number or a word \n");
 scanf("%29s", uInput);

/* if it contains any numbers do */
if(isNumber(uInput)){
result = prime(atoi(uInput));

  /* now I've created another if condition, if it is a prime number */
  if(result == 1){
   printf("It is a prime number: %s \n", uInput);
  } else {
   printf("It is a number: %s \n", uInput);

  }
}
else {
printf("It is a word %s \n", uInput);
}

return 0;
}

答案 1 :(得分:1)

您可以将字符串转换为JSFiddleatoi的数字。

main中,在确定输入数字后,将其转换为int并将其传递给prime

...
/* if it contains any numbers do */
if(isNumber(uInput)){
    int iInput = atoi(uInput);
    result = prime(iInput);

    /* now I've created another if condition, if it is a prime number */
...

然后您可以使用%d打印该号码:

printf("It is a prime number: %d \n", iInput); /* note: iInput */

%s

printf("It is a prime number: %s \n", uInput); /* note: uInput */

答案 2 :(得分:0)

您需要先使用fgets获取该行,然后使用sscanf进行扫描:

char line[80], word[32];
int num;

if (fgets(line, 79, stdin)) {
    if (sscanf(line, "%31s", word) == 1)
        printf("%s\n", word);                      // it's a string
    else if (sscanf(line, "%d", &num) == 1)        // it's a number
        printf("%d: %s\n", num, (isprime(num)) ? "Prime" : "Not Prime");
}

char *isprime(int n)
{
    int i;

    for (i = 2; i < n - 1; ++i)
        if (n % i == 0)
            return 0;
    return 1;
}