字符数组需不需要初始化?

xyzyz 2009-04-09 12:19:03
在定义一个字符数组时是否需要对其进行初始化呢?我看到的好像最好是进行初始化,今天在练习一个子串匹配的程序的时候,发现如果对字符数组进行初始化的话就会出错了。程序见下面。
附带的问题,在定义变量的时候是否都是需要进行初始化?
定义字符串的时候怎么进行初始化呢?

#include <stdio.h>

int main()
{
char string[50],substr[10];//如果是按照string[50]=" ",substr[10]=" "进行初始化的时候,程序就会出错
int i,j,k,count;
printf("输入字符串:");
gets(string);
printf("输入子串:");
gets(substr);
count=0;
for(i=0;string[i]!='\0';i++)
for(j=i,k=0;string[j]==substr[k];j++,k++)
{
if(substr[k+1]=='\0')
count++;
}
printf("子串出现的次数是:%d\n",count);
}
...全文
3732 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyerson 2011-09-23
  • 打赏
  • 举报
回复
char string[50] = {0};
出现这样一个问题,假如我按照这样进行初始化之后
主串为:i am am am(最后直接换行,无空格或其它字符)
子串为:am
返回的结果是10

如果主串为:i am am am(输入到最后的时候,不直接换行,加个空格或是其它字符)
子串为:
返回的结果为3,是正确的

呵呵,这个其实这两个输入都是对的,且结果也是对了,当然,你第二次误打误撞,它的结果跟你预想的一样,呵呵,其实,第一次跟第二次输入的不同就在于你第二次你多输入了几个空格键,(gets函数只对换行键敏感),你在分析,第一次除了几个字符以外,后面全是'\0',所以当你的string[j]比较到后面的话,刚好,你那个str[k]都是'\0',且后面的str[k+1]也刚好是'\0',所以,count就加了,至于第二种情况,你自己一样分析,就可以明白了。其实,你这个程序稍微有点瑕疵,如果在那第二个for语句中,再加上&&string[j]!='\0'&&substr[k]!='\0',就能达到你要的效果了。
hellsingmen 2011-06-21
  • 打赏
  • 举报
回复
for(j=i,k=0;string[j]==substr[k];j++,k++)
{
if(substr[k+1]=='\0')
count++;

i am am am 比较完之后 正好两个字符都是 '\0' ; 那么循环一直持续,K不断自加,substr[k+1]也一直都等于'\0'(substr[3]到substr[9])。所以前面的3次加上后面的7次,最后count == 10;
yrktcst 2011-05-22
  • 打赏
  • 举报
回复
记号
对我很有用
chenjunoooxue 2009-04-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 taotaogo 的回复:]
引用 18 楼 WOBUGUAN 的回复:
这跟初始化没关系,是你的字符串比较出了问题:
这里:
for(j=i,k=0;string[j]==substr[k];j++,k++)
你没有考虑string[j]和substr[k]都为'\0'的情况。



这位已经给你指出错误了,我分析了下你的错误在这里给你具体分析了:
(1) 如果你用char string[50]=""....这种方式其实也没有问题的了,一个字符占用一个存储单元,没有占满的全部填写字符'\0',其实放的是0;
错误在于你子…
[/Quote]看上面的
东莞某某某 2009-04-11
  • 打赏
  • 举报
回复
可以,但是不能先定义后赋值。指针可以!
  • 打赏
  • 举报
回复
char string[50] = {0}; //这样才是初始化呢。

string str=""; //string可以这样玩。
csdn5211 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Proteas 的回复:]
char string[50] = {0},substr[10] = {0};//
[/Quote]

正解,不是不能初始化,是你初始化的不对。

另外,数组最好用memset初始化。
Proteas 2009-04-09
  • 打赏
  • 举报
回复
char string[50] = {0},substr[10] = {0};//
liubuweiright 2009-04-09
  • 打赏
  • 举报
回复
string[50]=" "
//不能覆值字符串,应该是字符,如string[49] = '\0';
liubuweiright 2009-04-09
  • 打赏
  • 举报
回复
char string[50],substr[10];//如果是按照string[50]=" ",substr[10]=" "进行初始化的时候,程序就会出错

//问题1 string最好不要用这个命名
//问题2 string[50] 越界了
zgjxwl 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
char string[50] = {0}; //这样才是初始化呢。

string str=""; //string可以这样玩。
[/Quote]
gaomingok 2009-04-09
  • 打赏
  • 举报
回复
这是一个典型的数组越界的例子。C中数组下标是从0开始的
xyzyz 2009-04-09
  • 打赏
  • 举报
回复
这个程序我知道,不知道跟我写的那个有什么差别呢?
看起来功能似乎都是差不多...
[Quote=引用 12 楼 liliangbao 的回复:]
不是数组初始化的问题~
你的程序有点问题,参考:

C/C++ code#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
char str1[20] = {0},str2[20] = {0};
char *p1 = NULL,*p2 = NULL;
int sum = 0;
printf("please input two strings\n");
scanf("%s%s",str1,str2);
p1=str1;
p2=str2;
while(*p1!='\0')
{
if(*p1==*p2)

[/Quote]
liliangbao 2009-04-09
  • 打赏
  • 举报
回复
不是数组初始化的问题~
你的程序有点问题,参考:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
char str1[20] = {0},str2[20] = {0};
char *p1 = NULL,*p2 = NULL;
int sum = 0;
printf("please input two strings\n");
scanf("%s%s",str1,str2);
p1=str1;
p2=str2;
while(*p1!='\0')
{
if(*p1==*p2)
{
while(*p1==*p2&&*p2!='\0')
{
p1++;
p2++;
}
}
else
p1++;
if(*p2=='\0')
sum++;
p2=str2;
}
printf("%d",sum);

system("PAUSE");
return 1;
}
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
char string[50] = {0}; //这样才是初始化呢。

string str=""; //string可以这样玩。
[/Quote] char string[50] = {0}; //这样才是初始化呢。 是对的
不过 string str=""; //string可以这样玩。 是C语言的话,不可以,因为没有字符串类型
taotaogo 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mengde007 的回复:]
引用 6 楼 xyzyz 的回复:

char string[50] = {0}; 
出现这样一个问题,假如我按照这样进行初始化之后
主串为:i am am am(最后直接换行,无空格或其它字符)
子串为:am
返回的结果是10

如果主串为:i am am am(输入到最后的时候,不直接换行,加个空格或是其它字符)
子串为:
返回的结果为3,是正确的

这是为什么呢?

如果没对字符数组进行初始化,则没出现这样的问题。
楼主说清楚点,到底你的方法是怎么回事……
[/Quote]

看看我在21楼发布的,你就明白什么原因了
taotaogo 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 WOBUGUAN 的回复:]
这跟初始化没关系,是你的字符串比较出了问题:
这里:
for(j=i,k=0;string[j]==substr[k];j++,k++)
你没有考虑string[j]和substr[k]都为'\0'的情况。

[/Quote]

这位已经给你指出错误了,我分析了下你的错误在这里给你具体分析了:
(1) 如果你用char string[50]=""....这种方式其实也没有问题的了,一个字符占用一个存储单元,没有占满的全部填写字符'\0',其实放的是0;
错误在于你子串如果是和主串最后几位匹配的那么在第二个for循环的时候出问题了: 比如你输入的主串是:i am am 子串是:am
for(i=0;string[i]!='\0';i++)
for(j=i,k=0;string[j]==substr[k];j++,k++) // 当匹配主串最后一个am完之后,count++,j++,k++,substr[k]='\0',注意:string[j]也是='\0' 这个
{ // 时候第二个for循环条件成立,这样就会一直执行下去直到string[i]或者substr[k]不是'\0'即到数组
if(substr[k+1]=='\0') //超界
count++;
}
(2)比如你主串是aaabbbccc字串是aa 的希望得到结果是1还是2呢,这个你可以注意下。你现在的程序得到结果2
(3)总结下初试化的问题
char ch[50];char[10] //这里没有初试化,所以在你用puts赋值的时候(这个时候才开始申请空间)会把前面的空间沾满,比如:I am am 吧ch[0....7]最后一个是ch[7]='\0'后面的都不知道放的什么数据了,可能还没有申请空间,我没有记错的话应该是变量在初试化的时候编译器才给它分配空间。
char ch[50]="i am am";//这样初试化那么 a[8...49]放的什么呢? 你可以在初试之后立刻打印测试一下ch[8]或者ch[49],其实放的是0(是进制),也就是'\0'; 这就是你用这种方式出错根源。
(4)对于很多人说不能用string这家伙,其实他们是把c语言的字符和c++中的string类混淆了,可以去了解c风格的字符串头文件<csting>和c++的字串头文件<string>的用法
hongxia1981 2009-04-09
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
char string[50] = {'\0'},substr[10] = {'\0'};//如果是按照string[50]=" ",substr[10]=" "进行初始化的时候,程序就会出错
int i,j,k,count;
printf("输入字符串:");
gets(string);
printf("输入子串:");
gets(substr);
count=0;
for(i=0;string[i]!='\0';i++)
for(j=i,k=0;string[j]==substr[k] && substr[k] != '\0' ;j++,k++)/////here
{
if(substr[k+1]=='\0')
count++;

}
printf("子串出现的次数是:%d\n",count);
}
xyzyz 2009-04-09
  • 打赏
  • 举报
回复
即是:
假如我对字符数组按照char string[50] = {0},char substr[10]={0}初始化的话,会出现这样的问题:
第一种输入:
主串为:i am am am(最后直接换行,无空格或其它字符)
子串为:am
返回的结果是10,显然这个结果是错误的

第二种输入:
主串为:i am am am(输入到最后的时候,不直接换行,加个空格或是其它字符)
子串为: am
返回的结果为3,是正确的
--------------------------------
如果我没有对字符数组初始化的话,无论怎么输入
例如还是按照如下的输入
第一种输入:
主串为:i am am am(最后直接换行,无空格或其它字符)
子串为:am
返回的结果是3,正确

第二种输入:
如果主串为:i am am am(输入到最后的时候,不直接换行,加个空格或是其它字符)
子串为:
返回的结果为3,也是正确的

-------------------------------
这样说,清楚了没?
mengde007 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xyzyz 的回复:]
char string[50] = {0};
出现这样一个问题,假如我按照这样进行初始化之后
主串为:i am am am(最后直接换行,无空格或其它字符)
子串为:am
返回的结果是10

如果主串为:i am am am(输入到最后的时候,不直接换行,加个空格或是其它字符)
子串为:
返回的结果为3,是正确的

这是为什么呢?

如果没对字符数组进行初始化,则没出现这样的问题。
[/Quote]楼主说清楚点,到底你的方法是怎么回事……
加载更多回复(7)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧