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

时间:2019-05-25 08:19:01

标签: 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

3 个答案:

答案 0 :(得分:1)

您的问题是对"%s" conversion-specifier 的正确使用的误用或误解之一。 "%s"只会读到遇到第一个空白为止,然后它将停止。使用"55 33 66"scanf将仅读取"55",然后遇到空格并停止读取。

要阅读整行,可以使用字符类"%[^\n]"' instructing scanf to read all characters NOT a'\ n'`(因此基本上要进行阅读,直到找到换行符为止。

但是您尚未完成,在对阵列正确使用scanf之前,还有两个任务需要执行。由于您的数组仅包含100个字符,因此您必须使用 field-width 修饰符告诉scanf读取不超过99个字符,以保护数组绑定,因此为 nul-terminate 字符保留了空间。其次,您必须验证每个用户输入功能的返回,以确保您正在处理有效数据。将这些发挥作用,您可以做到:

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

您的标记化可以不变地使用,但是定界符要求的typeconst 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

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

答案 1 :(得分:0)

您需要执行scanf("%[^\n]",&numstr),否则它将在空格之前停止或使用fgets(numstr, 100, stdin)

答案 2 :(得分:-1)

#include <stdio.h>
#include <string.h>
char numstr[100];
char *tok;
char *dem = ' ';
int MAX_CHAR = 100; // Number character to read from the input buffer


int main(){
    printf("Num:"); 
    fgets(numstr, MAX_CHAR, stdin);
    tok = strtok(numstr, dem);
    while(tok != NULL){
        printf("Token: %s\n",tok);
        tok = strtok(NULL,dem);
    }
    return 0;
}