C-如何读取长度未知的字符串

C-如何读取长度未知的字符串,c,C,这是我的密码: int main() { int i=0; int size=1; char *pntName=NULL;//a pointer to an array of chars. pntName = (char*) malloc(size *sizeof(char));//allocate sapce for the first char. while(pntName[size-1]!=':'){ if(pntName!=NUL

这是我的密码:

int main() {
    int i=0;
    int size=1;
    char *pntName=NULL;//a pointer to an array of chars.
    pntName = (char*) malloc(size *sizeof(char));//allocate sapce for the first char. 
    while(pntName[size-1]!=':'){
        if(pntName!=NULL)//check the case couldn't allocate 
           printf("Error");
        else{
            if(i<size){//meaning there is space for new char.
                scanf("%c",&pntName[i]);
                i++;
            }
            else{//case we don't have enough space 
                size++;
                pntName = (char*)realloc(pntName,(size)*sizeof(char));//reallocat space.
                scanf("%c",&pntName[i]);
                i++;
            }
        }
     }
        return 1;
}
intmain(){
int i=0;
int size=1;
char*pntName=NULL;//指向字符数组的指针。
pntName=(char*)malloc(size*sizeof(char));//为第一个字符分配sapce。
而(pntName[size-1]!=':'){
if(pntName!=NULL)//检查案例是否无法分配
printf(“错误”);
否则{

如果(i您的错误案例在这里有问题

if (pntName != NULL)
   printf("Error");

在读取任何输入之前的循环的第一次迭代中,
pntName
被分配(设置为非空值),因此错误条件通过,字符串“error”已打印出来。您不是要退出while条件,因此这将无限期地重复。

字符串需要以
'\0'
结尾,因此允许额外的字符。重新分配时,最好使用另一个指针,以防重新分配失败

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i=0;
    int size=1;
    char *pntName=NULL;//a pointer to an array of chars.
    char *temp=NULL;//a temporary pointer

    pntName = malloc( size + 1);//allocate space for two char one for the '\0' to terminate the string
    while(1){
        size++;
        temp = realloc(pntName, size + 1);//reallocat space.
        if ( temp == NULL) {
            printf ( "error allocating memory");
            free ( pntName);
            return 1;
        }
        pntName = temp;
        if ( ( scanf("%c",&pntName[i])) == 1) {
            i++;
            pntName[i] = '\0'; // terminate the string
            if ( pntName[i-1] == ':') {
                break;
            }
        }
        else {
            break;
        }
    }
    printf ( "\n%s\n", pntName);
    free ( pntName);// release memory
    return 0;
}
#包括
#包括
内部主(空){
int i=0;
int size=1;
char*pntName=NULL;//指向字符数组的指针。
char*temp=NULL;//临时指针
pntName=malloc(size+1);//为两个字符分配空间,一个字符用于“\0”终止字符串
而(1){
大小++;
temp=realloc(pntName,size+1);//reallocat空间。
if(temp==NULL){
printf(“错误分配内存”);
免费(pntName);
返回1;
}
pntName=温度;
if((scanf(“%c”)和pntName[i])==1){
i++;
pntName[i]='\0';//终止字符串
如果(pntName[i-1]==':'){
打破
}
}
否则{
打破
}
}
printf(“\n%s\n”,pntName);
释放(pntName);//释放内存
返回0;
}

您面临的问题是什么?您不应该在c中转换malloc的结果,也请给我们一些您遇到的意外结果和
sizeof(char)
1
没有区别。使用它是胡说八道。除了缺少
#include
s之外,所示代码不包含任何重大问题。但是,它不会围绕扫描/重新分配部分循环,因此它只读取一个
字符
,然后结束。参考您的更新:
…==…
您确定吗?我已经修复了,但是打印字符串时仍然有问题,有时它会在“:”之后打印其他值