c - 为什么会出错?我对 strtok() 有问题;这么长时间

标签 c

我想在一行中输入数字。这造成了一些问题

我尝试跟随对方。我不知道这里有什么问题 它注意到了我 “[警告] 已弃用从字符串常量到 'char*' [-Wwrite-strings] 的转换”

#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = " ";
main(){
    printf("Num:");
    scanf("%s",numstr);
    tok = strtok(numstr,dem);
    while(tok != NULL){
        printf("Token: %s\n",tok);
        tok = strtok(NULL,dem);
    }
}

它显示

输入

Num: 55 33 66

输出

Token: 55

我想要

Token: 55
Token: 33
Token: 66

最佳答案

您的问题是对 "%s" 的正确使用的误用或误解之一。 转换说明符"%s"只会读取直到遇到第一个空白然后停止。与"55 33 66" , scanf只会读取 "55"然后遇到空格并停止阅读。

要读取整行,您可以使用字符类 "%[^\n]"' instructing scanf to read all characters NOT a '\n'` (所以基本上阅读直到到达换行符。

但是您还没有完成,在使用 scanf 之前您还有两项任务需要执行与您的阵列正确配合。因为你的数组只有 100字符,您必须使用 field-width 修饰符来保护数组绑定(bind) scanf阅读不超过99字符,从而为 nul-termination 字符保留空间。其次,您必须验证每个用户输入函数的返回,以确保您正在处理有效的数据。将这些投入使用,您可以这样做:

    printf ("Num: ");
    if (scanf ("%99[^\n]", numstr) != 1) {
        fputs ("error: user canceled input.\n", stderr);
        return 1;
    }

您的标记化可以不加修改地使用,但是 type所要求的分隔符是 const char* ,因此您应该更新 dem 的声明,例如,

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

char numstr[100];
char *tok;
const char *dem = " \t\n";

int main (void) {

    printf ("Num: ");
    if (scanf ("%99[^\n]", numstr) != 1) {
        fputs ("error: user canceled input.\n", stderr);
        return 1;
    }
    tok = strtok (numstr, dem);
    while (tok != NULL) {
        printf ("Token: %s\n", tok);
        tok = strtok (NULL, dem);
    }
}

(注意:我创建了 dem const char* 并添加了 tab '\t'newline '\n' 字符作为分隔符)

示例使用/输出

$ ./bin/strtok_numstr
Num: 55 33 66
Token: 55
Token: 33
Token: 66

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 为什么会出错?我对 strtok() 有问题;这么长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303087/

相关文章:

c - C select() 函数是否已弃用?

python - 将 Python C 扩展链接到另一个库的问题

c - C语言写入和读取文件

c - 为什么我的内存布局不同?

c - 递归函数中的段错误

c - 如何使用线程读写串口数据

c++ - 我究竟做错了什么? (多线程)

c - 在 C/C++ 中执行 linux 程序并通过 stdin/stdout 与其通信的最简单方法

c++ - 为什么这个 C 代码比这个 C++ 代码快?获取文件中的最大行

c - WIFEXITED WIFEXITSTATUS 宏