我有以下字符串abcd1234
,我想找到一种方法将此字符串分成两个不同的字符串abcd
和1234
。我尝试了以下代码:
char buf[100],*str1,*str2;
int x;
fgets(buf,sizeof(buf),stdin);
str1=strtok(buf,"0123456789 \t\n");
str2=strtok(NULL," \n\t\0");
puts(str1);
puts(str2);
x=atoi(str2);
printf("x=%d", x);
但输出为abcd 234
。如果我用一个字母和一个数字来尝试它,例如a2
我只输出e并且x
为0。
答案 0 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
size_t extract(const char **sp, char *out, int (*test)(int ch));
int main(void){
char buf[100], str1[100], str2[100];
int x;
const char *p = buf;
//size_t len;
fgets(buf, sizeof(buf), stdin);
while(*p){
if(isalpha((unsigned char)*p)){
extract(&p, str1, isalpha);
puts(str1);
} else if(isdigit((unsigned char)*p)){
extract(&p, str2, isdigit);
x = atoi(str2);
printf("%s, x=%d\n", str2, x);
} else {
++p;//skip one char
}
}
return 0;
}
size_t extract(const char **sp, char *out, int (*test)(int ch)){
const char *p = *sp;
while(*p && test((unsigned char)*p)){
*out++ = *p++;
}
*out = '\0';
size_t len = p - *sp;
*sp = p;
return len;
}
答案 1 :(得分:0)
尝试以下代码。希望这对您有所帮助。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char string[]="abcd1234";
char digitStr[10];
char charStr[10];
int i,j = 0,k = 0;
for(i=0;string[i];i++)
{
if(isdigit(string[i]))
{
charStr[j++]=string[i];
}
else
{
digitStr[k++]=string[i];
}
}
charStr[j] = '\0';
digitStr[k] = '\0';
printf("%s %s\n",digitStr,charStr);
}
答案 2 :(得分:0)
我意识到我对此事已经很晚了,但这是因为任何人都有类似的情况
假设所有输入字符串都像您的示例一样,此方法将起作用。
char buf[100];
fgets(buf, sizeof(buf), stdin);
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = '\0';
int x = atoi(strpbrk(buf, "0123456789"));
char letters[number - buf + 1];
memcpy(letters, sizeof(letters) - 1, buf);
letters[sizeof(letters) - 1] = '\0';
//letters is the word
//x is the number as an int, not a string
•请注意if
之后的fgets
语句。这将检查fgets是否读取了换行符,并将其转换为NUL字符。 (基本上是截断字符串)。
•对于strpbrk()
,这只是一个函数,它返回一个指针,该指针指向第一个字符串内第二个字符串中任何字符的第一个出现位置。我在这里用它来查找数字序列的开始。
•为了安全起见,我也将atoi()
丢给strtol()
。
•letters[]
数组大小是strpbrk()
(第一个数字的地址)的返回值减去数组的开头(给出字母字符串的长度(以字节为单位)),再加上一个NUL我稍后添加的字符。
答案 3 :(得分:-1)