C++ 字符串数组的问题

最近遇到字符串数组的问题,一直没能解决,大概是这样的
如何定义字符串数组?如何往字符串数组中添加新的字符串?如何判断新增的字符串是否重复?

char tmp[100][]={'127.0.0.1',"192.168.1.1","172.16.1.1"};
1.问题来了,编译的时候提示 size of the type 'char[]' is unknown or zero

后来修改为
char tmp[100][16]={'127.0.0.1',"192.168.1.1","172.16.1.1"}; //16的意思呢是255.255.255.255 再加'\0'的长度
printf(tmp[0][]); //编译时提示错误 Expression syntax
1.问题又来了,如何打印出来?其中一组呢? 怎样才能正确打印出来 127.0.0.1 或 192.168.1.1 呢?
2.如何往这个数组里面添加更多的IP地址呢?
3.假设新增加的IP是已经重复,如何判断IP是否重复呢?
上面'127.0.0.1'写错了,应该是双引号的
char tmp[100][16]={"127.0.0.1","192.168.1.1","172.16.1.1"};

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

main(){
char tmp[100][16]={"127.0.0.1","192.168.1.1","172.16.1.1"}; // 初始
int i,k,n=3;
int flag;
char yesno[5];
// 1 how to output: 如何输出
for (i=0;i<n;i++) cout << tmp[i] << endl;
while(1)
{
// 2:add 1: 如何加1个
cout << "input new ip, for example 192.168.1.2 " << endl;
cin >> tmp[n];

// 3: 判断有无重复,重复则 n 不变,不重复 则 n=n+1
flag=0;
for (i=0;i<n;i++) if (strcmp(tmp[i],tmp[n])==0) {flag=1; k=i; break;};
if (flag == 0) { n++; cout << "added" << endl;}
else { cout << "the ip is the same as tmp[" << k << "]" << endl;};
// 4: 是否 再加 新的
cout << "\nDo you want to add more? Y or N" << endl;
cin >> yesno;
if (yesno[0]!='Y' && yesno[0]!='y') break;
};
cout << "\n==================" << endl;
// 打印 所有 地址
for (i=0;i<n;i++) cout << tmp[i] << endl;
return 0;
}追问

如果把tmp换成int的类型呢
int tmp[N][8]={{12345},{23456},{34567}};
1.int的话如何添加数组?判断是否重复呢?
2.如何获得有字符串数组的长度呢?
3.初始化是否可以写成int tmp[][]; 或 char tmp[][];//因为最初的时候肯定是没有任何字符串的
4.如何删除数组中的某一项?比如127.0.0.1 不用了,如何删除?

追答

超出原来的问题范围了。简单答复如下:
用1维数组:int tmp[N]; 就可以了。
int tmp[N]={12345,23456,34567}; int n=3;
// 2:add 1: 如何加1个
cout > tmp[n];

// 3: 判断有无重复,重复则 n 不变,不重复 则 n=n+1
flag=0;
for (i=0;i<n;i++) if (tmp[i]==tmp[n]) {flag=1; k=i; break;};
if (flag == 0) { n++; cout << "added" << endl;}
else { cout << "the int is the same as tmp[" << k << "]" << endl;};
----
字符串数组的长度呢? 这是 int , 不是字符串,int 数组的长度 n.
---
初始化是否可以写成int tmp[][]; -- 不可以。因为没有给大小,也不能计算大小。
如果 1维用 int *tmp, 2 维用 int **tmp, 你可以用 动态分配 realloc, 随时增加单元。
----
何删除数组中的某一项?比如127.0.0.1 --
答: int 型 只能是整数,例如 127。不允许是 127.0.0.1
删除数组中的某一项,从 i=0; 到 i<n 找到tmp[i]==目标值,这项为 k=i,
如果 k==n-1, 则 n=n-1; 否则 { tmp[k]=tmp[n-1]; n=n-1。}
如果不想打乱队列,{for (j=k+1;j<n;j++) tmp[j-1]=tmp[j]; n=n-1;}

追问

多谢你的耐心回答,int的就不说了,我已经搞定了,但上面提到的字符串二维如何取数组下标?要怎么做呢?

追答

字符串二维如何取数组下标。
char tmp[100][16]。二维char数组.
作字符串看待时,看成 1维 字符串数组 tmp[i],下标 i=0 到99。
单个字符串长度15,外带1个字符串结束符。
字符串赋值,比较 用 scanf(), strcpy(),strcmp(), 之类的函数. 直接用 tmp[i] 形式。

追问

---作字符串看待时,看成 1维 字符串数组 tmp[i],下标 i=0 到99。

i的取值范围我知道,但是如何取出当前i是多少呢?比如,我要strcpy增加元素的时候,tmp[n]="127.0.0.1" //这个n的值如何确定呢?

追答

从一开始就要计数。
例如给你的完整程序里就有:
char tmp[100][16]={"127.0.0.1","192.168.1.1","172.16.1.1"}; // 初始化
int n=3;
接着的 //2。 //3 部分就是如何变化 n.
-----------
如果是输入:
char tmp[100][16];
int n=0;
// 输入1个,n增1。
FILE *fp;
fp=fopen("abc.txt","r");
while(1){
if ( (fscanf(fp,"%s",tmp[n]))==EOF ) break;
n++; // 更新
}
fclose(fp);

追问

用变量计数的方法我已经掌握了, 只是想知道是否有更好的办法, 多谢回答!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-19
#include <iostream>
#include <stdio.h>
#include <string.h>
#define N 100
using namespace std;
int main()
{
char tmp[N][16]={{"127.0.0.1"},{"192.168.1.1"},{"172.16.1.1"}};//添加括号
cout << tmp[0]<< endl;//打印
strcpy(tmp[3],"255.255.255.255");//添加
printf("%s\n",tmp[3]);//打印
for(int i = 0; i<N; i++)
{
if(strlen(tmp[3])==0)
continue;
if(strcmp(tmp[i],"172.16.1.1")==0)
cout<<i<<endl;//返回所在位置
}
return 0;
}追问

如果把tmp换成int的类型呢
int tmp[N][8]={{12345},{23456},{34567}};
1.int的话如何添加数组?判断是否重复呢?
2.如何获得有字符串数组的长度呢?
3.初始化是否可以写成int tmp[][]; 或 char tmp[][];//因为最初的时候肯定是没有任何字符串的
4.如何删除数组中的某一项?比如127.0.0.1 不用了,如何删除?

第2个回答  2013-11-19
char tmp[100][16]的意思不应该是16个100字符长的数组么?追问

不是的,char tmp[100][16] //100数组大小,16单个数组的字符串长度

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网