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++);