为什么 strtol 和 strtok 的这种组合不起作用?

发布于 2024-12-25 18:03:34 字数 252 浏览 2 评论 0原文

谁能告诉我这段代码有什么问题吗?

for(int i=0;i<4;i++)
{
    long int a = strtol(strtok("1-2-3-4","-"),(char**)NULL,10);
    cout << a <<endl
}

我在 Solaris Unix 上运行。它给了我一个分段错误。

错误出在 strtol() 中。

Could anyone tell me what is wrong with this code?

for(int i=0;i<4;i++)
{
    long int a = strtol(strtok("1-2-3-4","-"),(char**)NULL,10);
    cout << a <<endl
}

I'm running on Solaris Unix. It's giving me a segmentation fault.

The fault is in strtol().

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

2025-01-01 18:03:34

错误是由 strtok 调用引起的,而不是由 strtol 引起的。您不能对字符串文字调用 strtok,因为它将尝试修改字符串。修改字符串文字会导致 C++ 中出现未定义的行为。

The error is with the strtok call, not with strtol. You can't call strtok on a string literal, since it's going to try to modify the string. Modifying a string literal causes undefined behaviour in C++.

我的黑色迷你裙 2025-01-01 18:03:34

问题有很多。

我期望核心转储是因为字符串 "1-2-3-4" 存储在只读内存中,因此当 strtok() 修改它时(隔离第一个令牌),程序崩溃。你说崩溃发生在 strtol();这表明 strtok() 的返回值为 NULL。

第一次调用 strtok() 使用字符串作为参数;第二个调用在其位置传递 NULL 以指示“从上次停止的地方继续”。正如所写,如果字符串是可修改的,那么您将解析 1 四次。

这更接近正确(尽管未经测试):

char  input[] = "1-2-3-4";
char *data = input;
for (int i = 0; i < 4; i++)
{
    char *token = strtok(data, "-");
    if (token != 0)
    {
        long int a = strtol(token, NULL, 10);
        cout << a << endl;
    }
    data = NULL;
}

通常,您需要从 strtol() 进行错误检测;此外,这样做是相当令人担忧的。但是,有了示例字符串,您就不必担心这一点。

The problems are legion.

I would expect that the core dump is because the string "1-2-3-4" is stored in read-only memory, so when strtok() modifies it (to isolate the first token), the program crashes. You say the crash is in strtol(); that would suggest that the return value from strtok() is NULL.

The first call to strtok() uses the string as an argument; the second call passes NULL in its place to indicate 'continue where you left off last time'. As written, if the string was modifiable, then you'd parse 1 four times.

This is closer to correct (though untested):

char  input[] = "1-2-3-4";
char *data = input;
for (int i = 0; i < 4; i++)
{
    char *token = strtok(data, "-");
    if (token != 0)
    {
        long int a = strtol(token, NULL, 10);
        cout << a << endl;
    }
    data = NULL;
}

In general, you need to do error detection from strtol(); further, doing so is quite fraught. However, with the sample string, you would not have to worry about that.

望笑 2025-01-01 18:03:34

由于问题已经讨论过,我想展示一种替代方法:

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

    int main ()
    {
      long int a;
      char str[] ="1-2-3-4";
      char * pch;

      pch = strtok (str,"-");
      while (pch != NULL)
      {
         a = strtol(pch,(char**)NULL,10);
         cout << a <<endl;

        pch = strtok (NULL, "-");
      }
      return 0;
     }

As the problem is already discussed, I'd like to show an alternate approach :

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

    int main ()
    {
      long int a;
      char str[] ="1-2-3-4";
      char * pch;

      pch = strtok (str,"-");
      while (pch != NULL)
      {
         a = strtol(pch,(char**)NULL,10);
         cout << a <<endl;

        pch = strtok (NULL, "-");
      }
      return 0;
     }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文