C:如何在没有 strtol 的情况下从字符串中提取数字
C: How to extract numbers from string without strtol
我在从字符串中提取数字时遇到问题。
问题是我 不能按照老师的要求使用 strtol 或 isdigit 函数。
我应该将数字保存在 new array.
比如字符串输入:
11-some12meh13text-14
.
所以新数组将是:
11,12,13,14
(非-14)
我想到要做以下事情:
char str1[150];
int array[20];
int temporary, i=0, j=0; //i - for string, j - for array
for(i=0;i<=strlen(str1);i++) {
if(i==0) { //not needed to check if char before was number
if((str1[i]>=0) && (str1[i]<=9))temporary=str1[i];
if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
array[j]=temporary;
j++;
}
}
else if(i!=0) { //needs to be checked if char before was number
if((str1[i]>=0) && (str1[i]<=9)) {
if((str1[i-1]>=0) && (str1[i-1]<=9))temporary=temporary*10+str1[i];
else temporary=str1[i];
if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
array[j]=temporary;
j++;
}
}
}
}
我在我的电脑上试过了,但是程序崩溃了,我不知道也没有能力找出我做错了什么。
请帮忙!
谢谢!
字符'0'...'9'
的整数值不是0...9
。
因此,将每次出现的 str1[k]
更改为 str1[k]-'0'
。
如果允许使用 sscanf()
,这将解析字符串以获得整数。 %n
说明符将报告扫描处理的字符数。这使您可以在字符串中移动。
当扫描整数失败时 (!= 1),扫描集 "%*[^0-9\n]%n"
扫描并丢弃非数字或换行符的字符。 %n
捕获处理的字符数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( ) {
char str1[150] = {"0+1-=2!3*4-5/6#7&8|9^10"};
int array[20] = {0};
int offset = 0;
int each = 0;
int loop = 0;
int used = 0;
int length = 0;
length = strlen ( str1);
do {
sscanf ( str1 + offset, "%*[^0-9\n]%n", &used);
offset += used;
if ( ( sscanf ( str1 + offset, "%d%n", &array[each], &used)) == 1) {
offset += used;
each++;
if ( each >= 20) {
break;
}
}
} while ( offset < length);
for ( loop = 0; loop < each; loop++) {
printf ( "%d\n", array[loop]);
}
return 0;
}
这是您的代码的一个版本,它似乎可以工作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( ) {
char str1[150] = {"-0+1-=2!3*4-text-5/6#7&8|9^10 11end"};
int array[20] = {0};
int each = 0;
int loop = 0;
int saved = 1;
int length = 0;
int temporary = 0, i=0;
length = strlen ( str1);
for ( i = 0; i < length; i++) {
if ( ( str1[i] >= '0') && ( str1[i] <= '9')) {//found a digit
temporary = ( temporary * 10) + ( str1[i] - '0');
saved = 0;//flag not saved. temporary value may change
}
else {//found NOT a digit
if ( i > 0 && !saved) {//not at first character and not saved
array[each] = temporary;//save integer
each++;
saved = 1;//flag saved
temporary = 0;//reset
if ( each >= 20) {
break;
}
}
}
}
if ( !saved && each < 19) {//end of string is an integer. save it
array[each] = temporary;
each++;
}
for ( loop = 0; loop < each; loop++) {
printf ( "%d\n", array[loop]);
}
return 0;
}
我在从字符串中提取数字时遇到问题。
问题是我 不能按照老师的要求使用 strtol 或 isdigit 函数。
我应该将数字保存在 new array.
比如字符串输入:
11-some12meh13text-14
.
所以新数组将是:
11,12,13,14
(非-14)
我想到要做以下事情:
char str1[150];
int array[20];
int temporary, i=0, j=0; //i - for string, j - for array
for(i=0;i<=strlen(str1);i++) {
if(i==0) { //not needed to check if char before was number
if((str1[i]>=0) && (str1[i]<=9))temporary=str1[i];
if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
array[j]=temporary;
j++;
}
}
else if(i!=0) { //needs to be checked if char before was number
if((str1[i]>=0) && (str1[i]<=9)) {
if((str1[i-1]>=0) && (str1[i-1]<=9))temporary=temporary*10+str1[i];
else temporary=str1[i];
if((str1[i+1]<=0) && (str1[i+1]>=9)) {//if next char is NOT number
array[j]=temporary;
j++;
}
}
}
}
我在我的电脑上试过了,但是程序崩溃了,我不知道也没有能力找出我做错了什么。 请帮忙! 谢谢!
字符'0'...'9'
的整数值不是0...9
。
因此,将每次出现的 str1[k]
更改为 str1[k]-'0'
。
如果允许使用 sscanf()
,这将解析字符串以获得整数。 %n
说明符将报告扫描处理的字符数。这使您可以在字符串中移动。
当扫描整数失败时 (!= 1),扫描集 "%*[^0-9\n]%n"
扫描并丢弃非数字或换行符的字符。 %n
捕获处理的字符数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( ) {
char str1[150] = {"0+1-=2!3*4-5/6#7&8|9^10"};
int array[20] = {0};
int offset = 0;
int each = 0;
int loop = 0;
int used = 0;
int length = 0;
length = strlen ( str1);
do {
sscanf ( str1 + offset, "%*[^0-9\n]%n", &used);
offset += used;
if ( ( sscanf ( str1 + offset, "%d%n", &array[each], &used)) == 1) {
offset += used;
each++;
if ( each >= 20) {
break;
}
}
} while ( offset < length);
for ( loop = 0; loop < each; loop++) {
printf ( "%d\n", array[loop]);
}
return 0;
}
这是您的代码的一个版本,它似乎可以工作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ( ) {
char str1[150] = {"-0+1-=2!3*4-text-5/6#7&8|9^10 11end"};
int array[20] = {0};
int each = 0;
int loop = 0;
int saved = 1;
int length = 0;
int temporary = 0, i=0;
length = strlen ( str1);
for ( i = 0; i < length; i++) {
if ( ( str1[i] >= '0') && ( str1[i] <= '9')) {//found a digit
temporary = ( temporary * 10) + ( str1[i] - '0');
saved = 0;//flag not saved. temporary value may change
}
else {//found NOT a digit
if ( i > 0 && !saved) {//not at first character and not saved
array[each] = temporary;//save integer
each++;
saved = 1;//flag saved
temporary = 0;//reset
if ( each >= 20) {
break;
}
}
}
}
if ( !saved && each < 19) {//end of string is an integer. save it
array[each] = temporary;
each++;
}
for ( loop = 0; loop < each; loop++) {
printf ( "%d\n", array[loop]);
}
return 0;
}