我提前抱歉,因为我对编程很新,而且我的代码中的某些内容可能看起来完全是胡说八道!我不完全确定我是否正确使用atoi
。
我尝试创建一个程序,将用户输入句子拆分为单个单词,如果用户输入一个,则将数字加倍(浮点数/整数)。
例如,I have 3 cats
将显示为:
I
have
6
cats
我的程序现在能够分割句子,但我不能将整数加倍。任何人都可以帮我这个吗?
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char sentence[100];
printf("Enter a sentence to split: ");
scanf("%[^\n]s", sentence);
char *pch;
int y;
y = atoi(sentence);
printf("After splitting:\n", sentence);
pch = strtok(sentence," ");
while (pch != NULL) {
printf("%s\n", pch);
pch = strtok(NULL, " ");
}
system("PAUSE");
}
到目前为止我的输出:
Enter a sentence to split: Hi, I have 7 cats.
After splitting:
Hi,
I
have
7
cats.
Press any key to continue . . .
答案 0 :(得分:1)
这是一个更简单的版本,测试所有数字:
SET PATH=%PATH%;c:\the\location
python file_name.py
pause
如果您也想解析浮点数,可以使用以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char sentence[100];
char *pch;
printf("Enter a sentence to split: ");
if (!fgets(sentence, sizeof sentence, stdin))
return 1;
printf("After splitting:\n");
for (pch = strtok(sentence, " \n"); pch != NULL; pch = strtok(NULL, " \n")) {
if (pch[strspn(pch, "0123456789")] == '\0') {
printf("%d\n", atoi(pch) * 2);
} else {
printf("%s\n", pch);
}
}
system("PAUSE");
return 0;
}
请注意#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main(void) {
char sentence[100];
char *pch, *pend;
double value;
printf("Enter a sentence to split: ");
if (!fgets(sentence, sizeof sentence, stdin))
return 1;
printf("After splitting:\n");
for (pch = strtok(sentence, " \n"); pch != NULL; pch = strtok(NULL, " \n")) {
value = strtod(pch, &pend);
if (*pend == '\0' && isfinite(value)) {
printf("%g\n", value * 2);
} else {
printf("%s\n", pch);
}
}
system("PAUSE");
return 0;
}
的测试,以避免将isfinite()
和inf
识别为数字。
注意:nan
是C99的一部分,VisualStudio 12不支持它,但更新的版本支持它。对于此旧版本,请使用isfinite
中定义的_finite()
。
答案 1 :(得分:0)
对于拆分部分我会推荐这个版本,它更容易理解(考虑到你已经学会了for
工作方式)。它做同样的事情,但可以帮助您组织代码。
char *p;
int i;
for(p = strtok(sentence, " "); p != NULL; p = strtok(NULL, " "))
{
int isNumber = 1;
for(i = 0; i < strlen(p); i ++)
{
if(!isDigit(p[i])
{
isNumber = 0;
break;
}
}
if(isNumber == 1)
{
int number = atoi(pch);
number *= 2;
printf("%d\n", number);
}
else
{
printf("%s\n", p);
}
}
对于这个号码,我建议使用atoi
功能。 Here你有一个很好的参考。
要解决您的问题,首先,您需要检查您获得的每个单词。例如:你逐字逐句地看待&#34;字&#34;仅包含数字。如果它只包含数字,您可以使用atoi
将其转换为数字,将其乘以2并打印结果。
另一方面,如果你发现一个不是数字的字符,你的单词中有字母或任何其他字符,所以它不是一个字,所以你只需按原样打印它。
答案 2 :(得分:0)
这是一个有效的例子,即使它不是很精确。基本上,我们需要确定我们当前的字符串是否为数字。在这种情况下,我只是尝试获取当前字符串的第一个元素,并尝试确定它是否为数字。
当然,如果你想确实肯定,我们需要迭代字符串并检查每个字符,如果它是一个数字。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char sentence[100];
printf("Enter a sentence to split: ");
scanf("%[^\n]s", sentence);
char * pch;
int y;
y = atoi(sentence);
printf("After splitting:\n", sentence);
pch = strtok (sentence," ");
while (pch != NULL)
{
if(isdigit(pch[0]))
{
int number = atoi(pch);
number *=2;
printf("%d\n",number);
pch = strtok (NULL, " ");
continue;
}
printf("%s\n",pch);
pch = strtok (NULL, " ");
}
system("PAUSE");
}
答案 3 :(得分:0)
这是另一个(更紧凑的)答案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int is_numeric(char *s)
{
int i = 0;
while (s[i] != '\0') {
if (!isdigit(s[i]))
return 0;
++i;
}
return 1;
}
int main()
{
char sentence[255];
char *pch;
printf("Enter a sentence to split: ");
if (!fgets(sentence, sizeof(sentence), stdin)) {
return 1;
}
sentence[strcspn(sentence, "\n\r")] = 0; /* Strip newline */
pch = strtok(sentence, " ");
while (pch != NULL) {
if (atoi(pch)) {
printf("%d\n", 2 * atoi(pch));
} else {
printf("%s\n", pch);
}
pch = strtok(NULL, " ");
}
return 0;
/* system("PAUSE"); */
}
关键是atoi将返回0表示非数字参数。