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

时间:2015-12-15 18:12:40

标签: 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!=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;
}

我试图读取包含名称的字符串。用户可以输入字符,直到他输入&#39;:&#39;。 我的代码出了什么问题?

2 个答案:

答案 0 :(得分:5)

字符串需要以'\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;
}

答案 1 :(得分:2)

您的错误案例存在问题。

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

在读取任何输入之前的循环的第一次迭代中,pntName被分配(设置为非空值),因此错误条件通过并打印出字符串“Error”。你没有朝着退出的状态前进,所以这无限期地重复。