【问题标题】:Use value of token (strtok) in function in c在c中的函数中使用令牌(strtok)的值
【发布时间】:2016-04-01 13:30:28
【问题描述】:

我对使用令牌有点困惑,比如说:

int main(void) {
    char input[100];
    fgets(input, 100, stdin);
    char * token = strtok(input, " ");
    char * height = strtok(NULL, " ");
    char * width = strtok(NULL, " ");
    if (height > 9 && width > 9)
        set(height, width);
}

void set(char * height, char * width) {
    for (int i = 0; i < height + 1; i++) {
        for (int j = 0; j < width + 1; j++) {
            mine[i][j] = '*';
        }
    }
}

我刚刚发现我不能使用“height+1”,谁能告诉我有什么方法可以使用 height 的值?此外,我应该将 char *height 和 char *width 放入 void 集中吗?

谢谢!

【问题讨论】:

  • 为什么将char *s 与整数常量进行比较?这是一个违反约束的行为,你的编译器应该抱怨这个。
  • set 函数中,heightwidth 是指针...您应该在使用它们之前取消引用它们 (i&lt;*height+1;) 或将它们转换为整数 (strtol(...))。

标签: c function token strtok


【解决方案1】:

在使用fgets() 从您的流中读取并对其进行标记后,您应该将您的字符串转换为适当的整数值。

char *heightStr = strtok(NULL, " ");
char *widthStr = strtok(NULL, " ");
int heightVal = atoi(heightStr);
int widthVal = atoi(widthStr);

您的set() 函数也应该使用整数作为它的参数类型,而不是char* 即。 void set(int height, int width)

【讨论】:

  • 我想到了atoi,但我担心分段错误,因为我在ubuntu上写一个小程序时遇到了这个问题。它说分段错误(核心转储)。那么使用atoi安全吗?
  • 在编写一个接受用户输入的程序时,进行数据验证总是明智的。 atoi 将一个 c 字符串(即一个以空字符结尾的字符数组)作为其参数。如果您检查输入并验证传递给 atoi() 的内容是否有效,您应该没问题。
  • 您也可以使用strtol()将字符串转换为整数值。
【解决方案2】:

strtok() 将 c 字符串切割成片段并返回指向分隔子字符串的指针。

因此,使用您的代码,如果您输入“480 640”,指针height 将指向“480”,而指针width 将指向“640”。所以他们指向(ascii)字符串而不是整数。

如果你需要整数,你首先必须转换它们,例如atoi()

int main(void){
  ...
  char *token=strtok(input, " ");
  char *s_height=strtok(NULL, " "); // these are strings
  char *s_width=strtok(NULL, " ");
  int height=atoi(s_height), width=atoi(s_width); // convert to integers
  ... 
}

void set(int height, int width){
  ...
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2021-08-19
    • 2014-07-27
    • 2019-02-07
    相关资源
    最近更新 更多