【问题标题】:Trying to split stdin char[] by ','试图将 stdin char[] 拆分为 ','
【发布时间】:2017-03-18 09:34:13
【问题描述】:

我对 C 很陌生。我编写了一些代码来尝试用逗号分隔标准输入字符串,但我不确定如何最好地做到这一点。

基本上,我有一些数据将由用户按以下格式输入:

UserID (char[]), 00:00:00 (for time,(char[]), MeasurementID (char[ ]), readingValue(双精度)

我需要将这些值分开,以便将它们分别分配给一个变量。我写了一些代码,我尝试这样做,但是,我知道它不太正确。

char buffer [1024];
char input[];
scanf("%s", input);


int temp = 0;
int timekeeper = 0;
char userID[];
char timestamp[];
char measurementID[];
double value;

for(temp = 0; temp < sizeof(input); temp++){
    char val[1024];
    while(input[temp] != ','){
        val += input[temp];
    }
    if(timekeeper == 0){
        userID = val;
    }
    else if(timekeeper == 1){
        timestamp = val;
    }
    else if(timekeeper == 2){
        measurementID = val;
    }
    else if(timekeeper == 3){
        value = (double)val;
    }
    timekeeper++;
    
}

这些是我遇到的错误,如果它们有帮助的话。

exp.c:87:7: 错误:二进制 + 的操作数无效(有 'char[1024]' 和 ‘int’)

exp.c:90:6: 错误:分配给类型时类型不兼容 来自‘char *’类型的‘char[1024]’

exp.c:93:13: 错误:不兼容的类型 从“char *”类型分配给“char [1024]”类型时

exp.c:96:8: 错误:分配给类型“char [1024]”时的类型不兼容 输入‘char *’

exp.c:99:3: 错误:指针值在浮动的地方使用 预期点值

【问题讨论】:

  • 永远不要使用scanf("%s", input);,而是使用fgets
  • 这里缺少char input[]; 数组大小。
  • 不能在 C 中使用 + 扩展字符串。
  • 关于这一行:scanf("%s", input); 1) 始终检查返回值(不是参数值)以确保操作成功。 2) 使用%s 输入/转换说明符时,始终包含一个 MAX CHARACTERS 修饰符,这样用户就不会超出输入缓冲区。这种溢出是未定义的行为,并且可能/将导致段错误事件。注意:scanf() 将在第一次出现 white space char (for instance a space), so the whole line would not be input. Suggest using fgets()` 或 getline() 时停止输入字符
  • 这种语句:char userID[]; 将定义一个指向 char 的指针,该指针没有被初始化为指向任何特定的东西。 IE。将该声明更改为 char userID[ 20 ];

标签: c split stdin


【解决方案1】:

您似乎误解了字符串在 C 中的工作方式。

做类似的事情

val += input[temp];

不是有效的 C 代码。您不会将字符添加到这样的 C 字符串中。有用于操作字符串的特殊功能,例如strncatstrncpy 等等。

还有类似的定义

char userID[];

无效,因为没有数组大小。

注意

sizeof(input);

会给你变量的大小,但你可能想要字符串的长度,即改用strlen(input)

进一步你不能将字符串转换为双精度

value = (double)val;

改为查找atof 函数。

这部分

while(input[temp] != ','){
    val += input[temp];
}

将给你一个无限循环,因为temp(因此input[temp])不会改变。

我建议你看看这个答案Split string with delimiters in C,了解如何将一个字符串拆分为多个字符串。

【讨论】:

    【解决方案2】:

    您不能连接 char* 和 char[](“|”)或使用 + 的任何排列。请改用 strncat() 或 snprintf() 并确保目标缓冲区有足够的内存来存储最终字符串。

    【讨论】:

    • 那看起来像这样吗? strncat(val, (char)input[temp], 1024);
    • 这里是一个例子......stackoverflow.com/questions/14219418/…
    • @star_sh00ter,这个表达式:(char)input[temp] 有几个问题。 1) input[temp] 已经是单个字符,因此无需转换。 2)strncat() 的第二个参数必须是指针,而不是 char(尽管它可以是指向 char 数组的指针)
    猜你喜欢
    • 2012-02-25
    • 2017-10-27
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多