我编写了一个代码,用于使用指针扫描用户的字符串并将其存储在另一个字符串数组中并打印该字符串数组。输出很奇怪。打印前三个字符,但下一个字符作为随机垃圾值。请告诉我代码中的错误。以下是代码:
#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++);
}
答案 0 :(得分:1)
您没有将终止空字符('\0'
)放在字符串str1[]
和str2[]
的末尾。并且您尝试取消引用并检查第一个while循环条件中未初始化的值:while(*p1)
printf("Enter a string\n");
do{
scanf("%c",p1++);
}while(*(p1 - 1) != '\n'); //try the do while loop
*(p1 - 1) = '\0'; //placing terminating null character
p1 = &str1[0];
while(*p1){
*p2++ = *p1++;
}
*p2 = '\0'; //placing terminating null character
这里是演示代码:https://ideone.com/dF2QsJ
为什么在do while条件下检查新行的条件?为什么
p1-1
?
这是因为您输入'\n'
来结束输入,p1
存储在p1
,然后p1 + 1
在每次迭代结束时移至'\n'
。因此,我会检查p1 - 1
是否存在std::for_each
。
答案 1 :(得分:0)
没关系, 为什么你不使用%s并直接获得输入。你可以得到整个字符串而不是遍历每个字符。
答案 2 :(得分:0)
此循环
while(*p1)
scanf("%c",p1++);
在存储任何内容之前,检查str1
的内容(由p1
指向)。那个未初始化的内存可能包含任何内容,因此这个循环可能永远不会执行(如果第一个char恰好是NUL),或者可能在数组末尾运行(破坏内存)。