Arrays 在C(xv6)中访问字符数组的单个字符时出现问题
我在访问C中字符数组中的每个字符时遇到问题 我这样声明char数组:Arrays 在C(xv6)中访问字符数组的单个字符时出现问题,arrays,c,string,char,Arrays,C,String,Char,我在访问C中字符数组中的每个字符时遇到问题 我这样声明char数组:charddd[512]作为程序开始时的全局常量 然后,我使用int n将包含一行随机字符(如下所示:acdgeud)的文件读入字符字符串;n=读取(fd、ddd、sizeof(ddd))fd表示文件描述符,值为1 我想访问,例如,字符字符串的第二个字符,我尝试过代码> DDD [1 ] < /Cord>,因为这是我在C++中如何做的。但是,它在第一个字符之后提供了所有内容:cdgeud 现在,我如何一次只能得到一个字符?希望这
charddd[512]代码>作为程序开始时的全局常量
然后,我使用int n将包含一行随机字符(如下所示:acdgeud
)的文件读入字符字符串;n=读取(fd、ddd、sizeof(ddd))代码>fd
表示文件描述符,值为1
我想访问,例如,字符字符串的第二个字符,我尝试过代码> DDD [1 ] < /Cord>,因为这是我在C++中如何做的。但是,它在第一个字符之后提供了所有内容:
cdgeud
现在,我如何一次只能得到一个字符?希望这是明确的,并感谢帮助提前
更新:刚刚添加了部分代码:
char ddd[512];
void somefunc(int fd) {
char *another = malloc(512*sizeof(ddd));
int n = 0;
while ((n = read(fd, ddd, sizeof(ddd))) > 0) {
if ( n < 0 ) break;
for (int i = 0; i < n; ++i) {
/* I'm trying to copy values in ddd to another one by one */
another[i] = ddd[i]; /* This is not working */
}
}
}
charddd[512];
void somefunc(int fd){
char*other=malloc(512*sizeof(ddd));
int n=0;
而((n=read(fd,ddd,sizeof(ddd)))>0){
如果(n<0)断裂;
对于(int i=0;i
(编辑新答案)
要单步执行for
,必须在复制值后测试空字符。您也可以在“=”赋值后有一个单独的中断
for(int i=0;i
为简便起见,可以使用strncpy
:
strncpy(另一个,ddd,另一个的大小)代码>
要确保\0终止,请执行以下操作:
while((n=read(fd,ddd,sizeof(ddd)-1))>0){
ddd[(sizeof ddd)-1)='\0';//确保空终止
}
(原件)
根据你的评论,我只能猜测而不能正确回答
char某物[2];
char-ddd[512];
int n=读取(fd,ddd,sizeof(ddd));
printf(“c=%c\n”,ddd[1]);//打印一个字符(c)
printf(“s=%s\n”,1+ddd);//打印cdgeud,或者更多
//(如果memset(ddd,0,sizeof ddd)发生在读取之前,情况会更好)。
char另一个[sizeof(ddd)];
ddd[1]=另一个[1];//将另一个[1]中的内容复制到d[1]。不可预测,因为我将其编码为另一个[]未初始化
printf(“s=%s\n”,某物);//不可预测的。。。
//如果内存中出现[0]和[1]以外的内容“\0”和ddd(完全不保证)
//然后可以打印这些内容,后跟ddd的内容。
ddd不能保证\0终止这一事实可能是意外溢出的原因。这在没有memset()的情况下有效
n=读取(fd、ddd、ddd大小);
如果(nprintf(“%c\n”,ddd[1]);
将打印字符,&ddd[1]
确实是字符串cdgeud…
(缺少一个\0
终止符。谢谢!但我试图一次将这些值移到另一个字符字符串中,似乎无法这样做:ddd[1]=另一个[1]
。希望看到所有有问题的代码。由于太普遍了,有很多方法会出错…在我的时间里,我遇到了很多错误。对不起!我知道这样描述这个问题不是很清楚,但由于隐私原因,我无法发布代码。您认为有什么具体原因可能导致这些错误吗是问题吗?你应该给出最小的代码。这不是你实际使用的代码。相反,将你的代码减少到提供错误结果的最小行数。几乎可以肯定的是,它将少于10行。非常感谢你的评论。我怎么知道ddd是否以null结尾?我只是包括了部分代码来提问,cou你能看一看吗?在C语言中,你无法确定字符串是否以null结尾,除非你将[1]一个null安排在未覆盖的缓冲区中(memset size-1字节),或者[2]你在缓冲区中寻找null。C这样做很弱。f(n0)break
应该是n=0
,因为0是EOF。