gpt4 book ai didi

c - 如何将字符串值转换为数值?

转载 作者:行者123 更新时间:2023-11-30 20:30:39 25 4
gpt4 key购买 nike

我尝试过这段代码将我的 Str[] 字符串分成 2 个字符串,但我的问题是“我想将 John(name) 分开为字符串,将 100(marks) 分开为整数”,我该怎么做,任何建议?

   #include <stdio.h>
#include <string.h>

void main()
{
char Str[] = "John,100";
int i, j, xchange;
char name[50];
char marks[10];
j = 0; xchange = 0;

for(i=0; Str[i]!='\0'; i++){
if(Str[i]!=',' && xchange!=-1){
name[i] = Str[i];
}else{
xchange = -1;
}
if(xchange==-1){
marks[j++] = Str[i+1];
}
}
printf("Student name is %s\n", name);
printf("Student marks is %s", marks);
}

最佳答案

How to separate "John,100" into 2 strings?

共有三种常见方法:

  1. 使用strtok()将字符串拆分为单独的标记。这将修改原始字符串,但实现起来非常简单:

    int main(void)
    {
    char line[] = "John,100;passed";
    char *name, *score, *status;

    /* Detach the initial part of the line,
    up to the first comma, and set name
    to point to that part. */
    name = strtok(line, ",");

    /* Detach the next part of the line,
    up to the next comma or semicolon,
    setting score to point to that part. */
    score = strtok(NULL, ",;");

    /* Detach the final part of the line,
    setting status to point to it. */
    status = strtok(NULL, "");

    请注意,如果更改 char line[] = "John,100";,则 status 将为 NULL,但代码是否则可以安全运行。

    因此,在实践中,如果您要求所有三个字段都存在于line中,则足以确保最后一个字段不NULL:

        if (!status) {
    fprintf(stderr, "line[] did not have three fields!\n");
    return EXIT_FAILURE;
    }
  2. 使用sscanf()来转换字符串。例如,

        char  line[] = "John,100";
    char name[20];
    int score;

    if (sscanf(line, "%19[^,],%d", name, &score) != 2) {
    fprintf(stderr, "Cannot parse line[] correctly.\n");
    return EXIT_FAILURE;
    }

    这里,19指的是name中的字符数(总是为字符串结尾的nul字符保留一个,'\0 '),而 [^,] 是字符串转换,消耗除逗号之外的所有内容。 %d 转换 int。返回值是成功转化的次数。

    这种方法不会修改原始字符串,并且允许您尝试多种不同的解析模式;只要您先尝试最复杂的一种,您就可以使用很少的添加代码来允许多种输入格式。当我将 2D 或 3D vector 作为输入时,我经常这样做。

    缺点是 sscanf()(scanf 系列中的所有函数)会忽略溢出。例如,在 32 位体系结构上,最大的 int2147483647,但 scanf 函数会很高兴地转换,例如9999999999141006540​​7 (或其他值!),而不返回错误。您只能假设数字输入是正常的并且在限制范围内;您无法验证。

  3. 使用辅助函数来标记和/或解析字符串。

    通常,辅助函数类似于

    char *parse_string(char *source, char **to);
    char *parse_long(char *source, long *to);

    其中source是指向要解析的字符串中下一个字符的指针,to是指向存储解析值的位置的指针;或

    char *next_string(char **source);
    long next_long(char **source);

    其中source是指向要解析的字符串中下一个字符的指针,返回值是提取的标记的值。

    这些往往比上面更长,如果是我写的,那么对他们接受的输入相当偏执。 (我希望我的程序在无法可靠地解析其输入时提示,而不是默默地产生垃圾。)

<小时/>

如果数据是 CSV 的某种变体(逗号分隔值)从文件中读取,那么正确的方法是另一种方法:不是逐行读取文件,而是逐个 token 读取文件 token 。

唯一的“技巧”是记住结束标记的分隔符(您可以使用 ungetc() 来实现这一点),并使用不同的函数(读取并忽略其余部分)当前记录中的标记,并且)使用换行符分隔符。

关于c - 如何将字符串值转换为数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com