所以我对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),否则字符串检测不起作用,显然我的解决方案也不正确。
有什么建议吗?
答案 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)
在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;
}