Code Bye

strtok应用中char s[] 和 char *s 的区别

正确:

#include <string.h>
#include <iostream>
using namespace std;

void main()
{

    char s[] = "192.168.0.1";

    char *delim = ".";
    char *p;
    p=strtok(s, delim);
	printf("%s ", p);
    while((p = strtok(NULL, delim)))
        printf("%s ", p);
    printf("\n");
}

错误:

#include <string.h>
#include <iostream>
using namespace std;

void main()
{

    char *s = "192.168.0.1";

    char *delim = ".";
    char *p;
    p=strtok(s, delim);
	printf("%s ", p);
    while((p = strtok(NULL, delim)))
        printf("%s ", p);
    printf("\n");
}

不知道错误的原因!

5分
char *s = “192.168.0.1”;

这句必须写成:
char const *s = “192.168.0.1”;

编译器不报错,是历史的原因。

strtok这个函数会更改第一个参数的内容
10分
而char *s = “192.168.0.1”;中的s指向了一个常量字符串,其所在的内存是不能被更改的
char s[] = “192.168.0.1”;这里的s是用后面的常量字符串去初始化s所在的内存区域,这个区域是可以更改的
你可以通过调试来查看
5分
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!
仅供参考:
#include <stdio.h>
int main() {
    int IP[4];
    int i;
    char c;

    printf("请输入一个ip地址:");fflush(stdout);
    while (1) {
        rewind(stdin);
        if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {
            if (0<=IP[0] && IP[0]<=255
             && 0<=IP[1] && IP[1]<=255
             && 0<=IP[2] && IP[2]<=255
             && 0<=IP[3] && IP[3]<=255
             && ""\n""==c) {
                break;
            } else printf("输入的ip地址格式不对!\n请重新输入:\n");
        } else printf("输入的ip地址格式不对!\n请重新输入:\n");
    }
    for (i=0;i<4;i++) {
        printf("IP[%d]=%d\n",i,IP[i]);
    }
    return 0;
}
感谢

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明strtok应用中char s[] 和 char *s 的区别