扫描字符串直到“:”

时间:2015-12-17 18:36:39

标签: c while-loop scanf

我正在写一个代码,我想让它扫描一个名字,直到它到达“:”,但不知怎的,它继续扫描“:”。 那是我的代码:

char letter, StudentName[1][40];
int j=0;
scanf("%c", &letter);
while (letter != ":")
{
StudentName[1][j] = letter;
j++;
scanf("%c", &letter);
}

另外,虽然代码运行,但我收到一条警告信息:“警告C4047:'!=':'int'的间接级别与'char [2]”不同

3 个答案:

答案 0 :(得分:3)

在while循环条件下进行字符串比较而不是char比较。

你基本上要求的是((char *)letter ==(char *)" String")。

两件事:

一个 - 这不是你如何进行字符串比较。 (见:strcmp)。

两个 - 你甚至不想进行字符串比较,你想进行字符比较,所以将双引号改为单引号。

另外,你的字符串甚至不在堆栈上,它只在read read部分,因为它是在编译时分配的 - 所以没有堆栈/堆分配的指针永远不会是它&& #39; s相等:)。

此外,当您使用 N 索引分配数组时,您可以访问的最大索引不会有访问冲突/分段错误的错误 N-1 ,所以在你的例子,我改变了这一行:

StudentName[1][j] = letter;

StudentName[0][j] = letter;

而且,为了健壮性,请考虑在用户可以插入的输入量上加上一个上限(即 - 对while循环施加限制不超过sizeof(StudentName)字符的另一个条件。)

答案 1 :(得分:1)

没有理由将StudentName声明为char StudentName[1][40]。只需将数组声明为:

char StudentName[40] = {0};

注意上面,数组也被初始化为包含所有zero个。这是一个很好的习惯。为什么初始化所有变量是一种好的做法有很多原因。在这里,通过初始化为0,您可以使用 nul-terminated 填充字符数组(您可能将其用作字符串)如果你没有明确地终止你的字符串,那么就可以通过你的初始化来完成它。

接下来当进行字符输入(一次一个字符)时,您通常会想要使用getcharfgetc来避免使用scanf系列时遇到的一些陷阱功能。使用`getchar的简单实现如下所示:

#include <stdio.h>

int main (void) {

    char StudentName[40] = {0}; /* char array   */
    int letter = 0;             /* int value    */
    size_t idx = 0;             /* array index  */

    printf ("\nEnter StudentName (until ':'): ");   /* always prompt */

    /* read input until ':' (or end-of-line or end-of-input) */
    while ((letter = getchar()) != ':' && letter != '\n' && letter != EOF) {
        StudentName[idx++] = letter;

        if (idx + 1 == 40) break;  /* prevent writing beyond array */
    }

    StudentName[idx] = 0;   /* nul-terminate string */

    printf ("\nYou entered: %s\n\n", StudentName);

    return 0;
}

注意:您要检查 sentinel 字符':',但您还必须检查行尾(换行符'\n')和输入结尾EOF,通常为-1)。如果您将文件或其他内存块传递给代码,并且未能检查换行符EOF,如果输入中没有':',则代码将继续读取你的意见。 (直到有什么不好的事情阻止它......)同样,你需要验证你存储在数组中的字符数不超过40 - 1(为nul-terminating字符留出空间)。只需进行简单的索引检查或检查存储的字符数即可。

虽然您可以自由地使用数组索引来为数组填充字符,但这是一种(很多)情况,您通常需要指定一个指向数组开头的指针,然后只需使用指针填充您的数组阵列。它本质上是一个最适合环境的东西&#39;问题,意味着两者都没有比另一个更正确/错误,但熟悉在字符串中向下走指针是C语言中字符串/字符处理的基础。下面是一个使用指针的示例。

#include <stdio.h>

int main (void) {

    char StudentName[40] = {0}; /* char array   */
    char *p = StudentName;      /* pointer      */
    int c = 0;                  /* int value    */

    printf ("\nEnter StudentName (until ':'): ");   /* always prompt */

    /* read input until ':' (or end-of-line or end-of-input) */
    while ((c = getchar()) != ':' && c != '\n' && c != EOF) {
        *p++ = c;

        if (p - StudentName + 1 == 40) break;  /* prevent writing beyond array */
    }

    *p = 0;   /* nul-terminate string */

    printf ("\nYou entered: %s\n\n", StudentName);

    return 0;
}

<强>编译

gcc -Wall -Wextra -O3 -o bin/studentname studentname.c

(将-O3优化替换为-g以使用gcc生成调试符号

使用示例

$ ./bin/studentname

Enter StudentName (until ':'): John Q. Smith:Age 21:Weight 180

You entered: John Q. Smith

或将输入重定向到您的程序:

$ printf "John Q. Smith:Age 21:Weight 180\n" | ./bin/studentname2

Enter StudentName (until ':'):
You entered: John Q. Smith

注意:,这只是一个问题,但如果您打算接受用户输入,提示该用户。否则,用户将看到一个闪烁的光标,想知道程序是否挂起。显然你在阅读文件时不会,但在要求输入时,提示

如果您有任何其他问题,请与我们联系。

答案 2 :(得分:-1)

你可以这样做,你不需要一个可变的字母。如果你想使用变量字母你只需要分配字符&#39;:&#39;写信并将其与StudentName值进行比较

int i,j;
for(i=0;i<2;i++){
for(j=0;j<40;j++){
if(StudentName[i][j]==':')}break;
scanf("%c", &StudentName[i][j]);}