繁体   English   中英

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

[英]Scanning and printing strings using pointers

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

#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' ) 放在字符串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 因此,我检查p1 - 1处是否存在'\\n'

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

这个循环

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM