将字符串分隔为较小的字符串

时间:2016-01-27 09:47:07

标签: c string

我有以下字符串abcd1234,我想找到一种方法将此字符串分成两个不同的字符串abcd1234。我尝试了以下代码:

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。

4 个答案:

答案 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)

根据strtok()

man page
  

每次调用strtok()都会返回一个指向包含下一个标记的以null结尾的字符串的指针。 此字符串不包含分隔字节。 [...]

因此,在第一次使用"0123456789 \t\n"作为分隔符时,1将被视为实际分隔符,并且在后续解析中不会被考虑。

您可能希望使用strcspn()和/或strpbrk()找出所需子字符串的索引并进行相应的解析。