我想在一行中输入数字。这造成了一些问题
我尝试跟随对方。我不知道这里有什么问题 它注意到了我 “[警告] 已弃用从字符串常量到 '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/