0

ファイルから127.0.0.1のようなIPアドレスを分割しようとしています:

次のCコードを使用します。

pch2 = strtok (ip,".");
printf("\npart 1 ip: %s",pch2);
pch2 = strtok (NULL,".");
printf("\npart 2 ip: %s",pch2);

また、IPはchar ip [500]であり、IPが含まれています。

印刷するとき、それはパート1として127を印刷しますが、パート2としてそれはNULLを印刷しますか?

誰かが私を助けることができますか?

編集:

全機能:

FILE *file = fopen ("host.txt", "r");
char * pch;
char * pch2;
char ip[BUFFSIZE];
IPPart result;

if (file != NULL)
{
    char line [BUFFSIZE]; 
    while(fgets(line,sizeof line,file) != NULL)
    {
        if(line[0] != '#')
        {
                            pch = strtok (line," ");
            printf ("%s\n",pch);

            strncpy(ip, pch, strlen(pch)-1);
            ip[sizeof(pch)-1] = '\0';

            //pch = strtok (line, " ");
            pch = strtok (NULL," ");
            printf("%s",pch);


            pch2 = strtok (ip,".");
            printf("\nDeel 1 ip: %s",pch2);
            pch2 = strtok (NULL,".");
            printf("\nDeel 2 ip: %s",pch2);
            pch2 = strtok(NULL,".");
            printf("\nDeel 3 ip: %s",pch2);
            pch2 = strtok(NULL,".");
            printf("\nDeel 4 ip: %s",pch2);

        }
    }
    fclose(file);
}
4

3 に答える 3

3

あなたは

strncpy(ip, pch, sizeof(pch) - 1);
ip[sizeof(pch)-1] = '\0';

これは

strncpy(ip, pch, strlen(pch));
ip[strlen(pch)] = '\0';

またはそれ以上に、ただ

strcpy(ip, pch);

sizeof(pch) - 1sizeof(char*) - 1、32ビットマシンではわずか3バイトだからです。これは3文字、つまり「127」に対応します。これは、2番目strtok()にNULLを与えるという観察結果と一致しています。

于 2012-11-25T17:02:04.863 に答える
1

私はあなたのコードを次のように使用しました、そしてそれは私のために働きます

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

char ip[500] = "127.0.0.1";

int main() {
    char *pch2;
    pch2 = strtok (ip,".");
    printf("\npart 1 ip: %s",pch2);
    pch2 = strtok (NULL,".");
    printf("\npart 2 ip: %s",pch2);
    return 0; 
}

実行

linux$ gcc -o test test.c
linux$ ./test

part 1 ip: 127
part 2 ip: 0
于 2012-11-25T16:59:00.793 に答える
0

問題が見つかったので、Visual Studioはポインターに0を追加し、それはNULLと同じです...

于 2012-11-25T17:04:02.360 に答える