Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在C(xv6)中访问字符数组的单个字符时出现问题_Arrays_C_String_Char - Fatal编程技术网

Arrays 在C(xv6)中访问字符数组的单个字符时出现问题

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 现在,我如何一次只能得到一个字符?希望这

我在访问C中字符数组中的每个字符时遇到问题

我这样声明char数组:
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大小);
如果(n
printf(“%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。