查找字符串中整数的总和
Finding sum of ints in a string
我需要输出句子中数字的总和。
例如:
- 输入:abc3x casa2 y34zq
- 输出:3+2+3+4 = 12
我需要阅读所有包含 space 的句子才能执行此操作,但我的 getchar
循环不起作用。可以帮我找出问题吗?
int main() {
int i = 0;
int somma = 0;
char s[MAX];
printf("inserisci la stringa : ");
scanf("%s",s);
while((s[i] = getchar()) != '\n'){
i++;
if(s[i]>'0' && s[i]<'9'){
somma+= (int)s[i]-(int)'0';
}
}
printf("la somma è = %d", somma);
}
我不必使用 getchar
。我更愿意使用 fgets
,因为我知道 fgets
可以读取整行,包括 space。
有两种方法可以解决您的问题。
- 从用户那里一次性获取整个字符串
要读取整个字符串,您可以在使用时使用 scanf
。它将整个字符串存储在数组中(s
在你的例子中)然后你可以解析这个数组并像你一样执行操作。这里的限制是字符串的长度。您只能接受 MAX
大小的字符串,因为您的数组大小如此之大。如果您对此没问题,那么您的代码是正确的。您需要做的就是从 while
.
中删除 getChar()
- 一次读一个字符.
或者,您可以一次从用户那里读取一个字符,然后立即对该字符执行操作。在这种情况下,您不需要声明数组。一个字符变量就足够了,您可以继续接受来自用户的数据。在这种情况下,丢弃 scanf()
并在您的 while()
中接受一个字符的 getChar()
输出并执行您的操作。
P.S。你的 while() 中有一个小错误,在少数情况下会给你不正确的结果。
因为您可以使用 fgets()
you can read the entire line and then use isdigit()
来查找数字。
FILE *fp;
fp = fopen("file.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
char line[MAX];
if( fgets(line, MAX, fp) == NULL ) { // Read entire line
perror("Error reading file");
return -1;
}
int sum = 0;
int len = strlen(line);
for (int i = 0; i < len; i++) {
if (isdigit( (unsigned char)line[i] )) { // cast handles negative values of line[i]
sum += line[i] - '0'; // Add integer value to sum
}
}
基本思路是一样的,只是它直接循环一个字符串,而不是在每一步都尝试用 getchar()
读取它。
我需要输出句子中数字的总和。 例如:
- 输入:abc3x casa2 y34zq
- 输出:3+2+3+4 = 12
我需要阅读所有包含 space 的句子才能执行此操作,但我的 getchar
循环不起作用。可以帮我找出问题吗?
int main() {
int i = 0;
int somma = 0;
char s[MAX];
printf("inserisci la stringa : ");
scanf("%s",s);
while((s[i] = getchar()) != '\n'){
i++;
if(s[i]>'0' && s[i]<'9'){
somma+= (int)s[i]-(int)'0';
}
}
printf("la somma è = %d", somma);
}
我不必使用 getchar
。我更愿意使用 fgets
,因为我知道 fgets
可以读取整行,包括 space。
有两种方法可以解决您的问题。
- 从用户那里一次性获取整个字符串
要读取整个字符串,您可以在使用时使用 scanf
。它将整个字符串存储在数组中(s
在你的例子中)然后你可以解析这个数组并像你一样执行操作。这里的限制是字符串的长度。您只能接受 MAX
大小的字符串,因为您的数组大小如此之大。如果您对此没问题,那么您的代码是正确的。您需要做的就是从 while
.
getChar()
- 一次读一个字符.
或者,您可以一次从用户那里读取一个字符,然后立即对该字符执行操作。在这种情况下,您不需要声明数组。一个字符变量就足够了,您可以继续接受来自用户的数据。在这种情况下,丢弃 scanf()
并在您的 while()
中接受一个字符的 getChar()
输出并执行您的操作。
P.S。你的 while() 中有一个小错误,在少数情况下会给你不正确的结果。
因为您可以使用 fgets()
you can read the entire line and then use isdigit()
来查找数字。
FILE *fp;
fp = fopen("file.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
char line[MAX];
if( fgets(line, MAX, fp) == NULL ) { // Read entire line
perror("Error reading file");
return -1;
}
int sum = 0;
int len = strlen(line);
for (int i = 0; i < len; i++) {
if (isdigit( (unsigned char)line[i] )) { // cast handles negative values of line[i]
sum += line[i] - '0'; // Add integer value to sum
}
}
基本思路是一样的,只是它直接循环一个字符串,而不是在每一步都尝试用 getchar()
读取它。