Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
C 使用指针扫描和打印字符串_C_Pointers_C Strings - Fatal编程技术网

C 使用指针扫描和打印字符串

C 使用指针扫描和打印字符串,c,pointers,c-strings,C,Pointers,C Strings,我编写了一个代码,用于使用指针扫描来自用户的字符串,并将其存储在另一个字符串数组中,然后打印该字符串数组。输出非常奇怪。前三个字符将被打印,但下一个字符将作为随机垃圾值出现。请告诉我代码中的错误。代码如下: #include<stdio.h> int main(void) { char str1[8]; char *p1=str1; char str2[8]; char *p2=str2; printf("Enter a string\n");

我编写了一个代码,用于使用指针扫描来自用户的字符串,并将其存储在另一个字符串数组中,然后打印该字符串数组。输出非常奇怪。前三个字符将被打印,但下一个字符将作为随机垃圾值出现。请告诉我代码中的错误。代码如下:

#include<stdio.h>
int main(void)
{
    char str1[8];
    char *p1=str1;
    char str2[8];
    char *p2=str2;
    printf("Enter a string\n");
    while(*p1)
        scanf("%c",p1++);
    *p1='\0';
    p1=&str1[0];
    while(*p1)
        *p2++=*p1++;
    *p2='\0';
    printf("The copied string is :");
    p2=&str2[0];
    while(*p2)
        printf("%c",*p2++);
}
#包括
内部主(空)
{
char-str1[8];
char*p1=str1;
char-str2[8];
char*p2=str2;
printf(“输入字符串”);
而(*p1)
scanf(“%c”,p1++);
*p1='\0';
p1=&str1[0];
而(*p1)
*p2++=*p1++;
*p2='\0';
printf(“复制的字符串是:”);
p2=&str2[0];
而(*p2)
printf(“%c”,*p2++);
}

您没有将终止的空字符(
'\0'
)放在字符串的末尾
str1[]
str2[]
。您正在尝试取消引用并检查第一个while循环条件中未初始化的值:
while(*p1)

下面是演示代码:

为什么在do while条件中检查新行的条件?为什么是p1-1

这是因为您通过输入存储在
p1
'\n'
来结束输入,然后
p1
在每次迭代结束时移动到
p1+1
。因此,我检查
'\n'
是否存在于
p1-1

好的, 为什么不使用%s并直接获取输入。您可以获得整个字符串,而不是在每个字符上循环

这个循环

while(*p1)
    scanf("%c",p1++);

在存储任何内容之前,检查str1的内容(由p1指向)。未初始化的内存可能包含任何内容,因此此循环可能永远不会执行(如果第一个字符恰好是NUL),或者可能会从数组末尾运行(损坏内存)。

您的输入是什么?顺便说一句,原因可能是缺少终止空字符
while(*p1)
,但是
p1
指向的变量在测试之前没有初始化。我初始化了指向str1基元素的*p1指针[8]我的输入是:chayan。输出为:cha#$。正如您所看到的,最后两个值是垃圾。是的
p1
是初始化的,但它指向的不是。
str1[]
中的值不确定。此外,您没有使用下面的循环所寻找的
'\0'
终止符完成输入。这是因为我正在练习指针,希望使用指针解决简单的数组和字符串问题。
while(*p1)
    scanf("%c",p1++);