2015-11-01 36 views
0

因此,我对C相对陌生,并尝试使用一些初学者程序。其中一个是从stdin(通过使用scanf)读取用户输入的程序。通过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%肯定没有在这个代码中的错误(而不仅仅是语法一个)。我可能甚至知道它在哪里,但由于我缺乏知识,我不确定如何解决它。

所以当我在做素数的函数时,我不确定是否应该将其作为字符串或整数的结果。问题是,我的程序以字符串的形式贯穿整个单词,即使它是一个数字,在技术上它仍然是一个字符串,'幻想它是一个数字'。

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

但是没有成功。目前,该字检测工作,但是当我如2输入,在

“我输入2成的scanf()通过控制台”我的输出结果

这是一个数2686752

期望的结果将是

这是一个质数:2

(也被演绎手段,它甚至不使用第一,如果和跳到别的,因为如果它本来是一个素数的printf吧是不同的。所以我的“素数”函数也可能有问题。

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

有什么建议吗?

+0

你不能增加一个'为const char *'指针。 – stackptr

+0

@cpp_prog是的,你可以,但你不能改变它指向的内容。 'const char *'表示'指向常量字符的指针'。你正在考虑'char * const',这意味着'常量指向字符'。 – Kninnug

回答

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; 
} 
+0

嘿!我可以打扰你多几分钟吗?您能否详细说明(以某种简单的方式)为什么(数字== divider)不正确?我的头脑是一片空白,我不想只是盲目复制粘贴代码,但实际上可以知道我的错误在哪里。尽管如此,非常感谢,非常感谢:-) – Rawrplus

+0

'divider'永远不可能等于'number'在循环内。当'divider'递增到'number'时,循环退出,因为它不符合'divider <= number - 1'的条件。 – user1969104

1

您可以使用atoistrtol将字符串转换为数字。

在你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 */ 
+0

解决了我的价值观问题。不幸的是检测问题。它目前打印“它是一个数字:(数字)”,不管它是否是素数。 不知道如果你有任何建议,谢谢,不管。 – Rawrplus

+0

@Rawrplus:这个答案应该起作用_根据推测,我的函数中的所有内容都是正确的。 – mouviciel

+0

@mouviciel以及我发现我的推定是不正确的。无论如何,两者的解决方案现在都以突出的答案提供。 – Rawrplus

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; 
}