Scanf 无法在 C 语言中正确读取字符串。出了什么问题?

Scanf doesn't read string properly in C. What's wrong?

我正在编写一个代码,该代码应该在字符串中找到空格并将它们前后的部分分隔在不同的字符串数组中。第一个问题是 scanf 甚至没有正确读取我的字符串,而且我之前没有在 C 中使用过字符串并且很好奇它是否正确(尤其是对于 a[] 数组)。

char expr[50];
char *a[50];
scanf("%s",expr);
int i=0;
int j=0;

while (strlen(expr)!=0){
    if (expr[i]==' '){
        strncpy(a[j],expr,i);
        strcpy(expr,expr+i+1);
        j++;
        i=0;
    }
    else {
        if (strlen(expr)==1){
            strcpy(a[j],expr);
            strcpy(expr,"");
            j++;
            i=0;
        }
        else i++;
    }

}

i=0;

for (i=0; i<j; i++){
    printf("%s\n",a[i]);
}
return 0;

此代码错误。

首先,不要使用未初始化的a[j]

添加

if((a[j]=calloc(strlen(expr)+1,sizeof(char)))==NULL)exit(1);

strncpy(a[j],expr,i);strcpy(a[j],expr); 之前分配一些内存。

其次,strcpy(expr,expr+i+1);是错误的,因为strcpy()不接受重叠区域。

最后,如果 scanf("%s",expr); 避免缓冲区溢出,您应该使用 scanf("%49s",expr);

  1. 不要使用 scanf,使用 gets() 作为标准输入或 fgets()FILE*

  2. 要将字符串分成由空格分隔的元素,只需使用 strtok():

字符表达式[50];</p> <pre><code>gets(expr); char* a[50]; int i; for (i = 0; i < 50; i++) { a[i] = (char*)malloc(10); // replace 10 with your maximum expected token length } i = 0; for (char* token = strtok(expr, " "); token != NULL; token = strtok(NULL, " ")) { strcpy(a[i++], token); } for (int j = 0; j < i; j++) { printf("%s\n", a[j]); } // don't forget to free each a[i] when done.

  1. 为简单起见,此示例使用了已弃用的函数,例如 strcpy,请考虑将其替换为 strcpy_s