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

时间:2017-01-08 18:00:21

标签: 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");
    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++);
}

3 个答案:

答案 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),或者可能在数组末尾运行(破坏内存)。