它是基于命令行的c程序检查回文字符串,我的回答是正确的,但我不得不在终端提供2次参数

问题描述 投票:-4回答:3

我认为我在主要功能中犯了错误,如果有任何请向我解释,因为我是命令行和功能的新手

#include < stdio.h > 
#include < string.h >
  int palindrome(char string[200]) {
    int i;
    int flag = 0;
    for (i = 0; i < strlen(string); i++) {
      if (string[i] == string[strlen(string) - i - 1])
        flag = 1;
      break;
    }
    if (flag == 1)
      printf("palindrome string");
    else
      printf("not palindrome string");

    return 0;

  }
int main(int argc, char * argv[]) {
  char string[200];
  gets(string);
  (argv[1]) == string;
  return palindrome(argv[1]); 

}
c command-line-arguments palindrome argv
3个回答
1
投票

正如评论中所指出的那样,qazxsw poi这一行什么也没做(qazxsw poi会告诉你(argv[1]) == string

此外,gcc功能不会被使用,即使对于测试程序,warning: statement with no effect [-Wunused-value]也会做同样的工作,更安全:

gets

所以你纠正的fgets代码可能是:

/* assuming string is an array: */
fgets(string, sizeof string, stdin); 

/* when string points on at least `size` bytes: */
fgets(string, size, stdin);

但是,main()函数存在逻辑问题,请看:

int main(int argc, char * argv[])   
{
  char string[200];
  fgets(string, sizeof string, stdin);

  return palindrome(string); 
}

palindrome放在这里,你只会测试int flag = 0; for (i = 0; i < strlen(string); i++) { if (string[i] == string[strlen(string) - i - 1]) flag = 1; break; } (你可以在break之前添加一个i = 0来看这个。

因此,以相同字母开头和结尾的每个字符串都将被视为回文...

而且,您应该反转测试。 printf("testing i=%d", i);应该被引入if并且如果两个测试的字母不同则设置为flag

你的1循环应该是这样的:

0

为了更进一步,可以改进给定的代码:

  • 有很多调用for函数,一次调用就足够了,
  • 每个字母都测试两次,int flag = 1; for (i = 0; i < strlen(string); i++) { printf("testing %d vs %d\n", i, strlen(string)-i-1); if (string[i] != string[strlen(string) - i - 1]) { flag = 0; break; } } 循环退出条件可以更好...

1
投票

strlen()

你的程序无法给出正确的结果,因为用于检测输入字符串是否为回文的for循环不会多次迭代。 [查看以下内容了解更多详情]

我不知道究竟是什么意思 - it is command line based c program to check for palindrome string and my answer is coming right but i had to supply arguments 2 times in the terminal....

通过查看你的代码,我只能说你必须传递字符串(以检查它是否是回文)作为命令行参数,因为你的fori had to supply arguments 2 times in the terminal所以它停在那里等待用户输入,你必须将您作为命令行参数传递的相同字符串提供给程序。 似乎这就是你的陈述 - main()

首先不要使用gets()。它不安全,而且已经过时了。检查gets()。 而是使用fgets()。检查i had to supply arguments 2 times...

有两种方式可以获得输入 -

  • 在运行时从用户处获取(您可以使用this
  • 将其作为命令行参数传递

因为,在问题摘要中,你提到过 - this 所以在我的回答中,我将把输入作为命令行参数。

如果您正在使用fgets()编译器,使用it is command line based c program to check for palindrome string and my answer is...选项编译程序,编译器将在此语句中给出警告消息

gcc

-Wall -Wextra

在函数(argv[1]) == string; warning: statement with no effect循环中,您在第一次迭代中打破了循环:

for

并且palindrome()函数最终根据输入字符串的第一个和最后一个字符是否相同来报告回文。

只有当字符串前半部分位置for (i = 0; i < strlen(string); i++) { if (string[i] == string[strlen(string) - i - 1]) flag = 1; break; // <--- will break the loop in first iteration } 处的任何字符与字符串后半部分位置palindrome()中的字符不匹配时,才应该打破循环。 此外,您不需要迭代整个字符串来检查它是否是回文:

i

您只需要将字符串迭代到其中间以检测字符串是否是回文。

string_len - i -1的返回类型是for (i = 0; i < strlen(string); i++) { ^^^^^^^^^^^^^ ,这是一个strlen()。所以,最好采用相同类型的循环迭代器。

头文件名与开始和结束角括号size_t之间不应有空格:

unsigned integer

在查找头文件时,编译器也在名称中包含空格,并且不修剪前导和尾随空格,并将报告<,>头文件未找到错误。

把这些放在一起,你可以做到:

#include < stdio.h > 
#include < string.h >

你可以像这样使用它:

' stdio.h '

-1
投票

我没有看到一个实际的问题,所以我也会发布我自己的实现,这实际上是有效的,因为你的整个代码是一团糟。随意问什么。

#include <stdio.h>
#include <string.h>

int palindrome(char *p_string) {
    int flag = 0;
    size_t len = strlen(p_string);

    if (len == 1)
        flag = 1;

    for (size_t i = 0; i < (len/2); i++) {
        if (p_string[i] == p_string[len - i - 1])
            flag = 1;
        else
            break;
    }

    if (flag == 1)
        printf("palindrome string\n");
    else
        printf("not palindrome string\n");

    return 0;
}
int main(int argc, char * argv[]) {
    /* Check for number of expected arguments */
    if (argc != 2) {
        fprintf (stderr, "Invalid number of arguments\nUsage:%s <string>\n", argv[0]);
        return -1;
    }

    palindrome(argv[1]);
    return 0;
}

命名为可执行文件'myNewProgram'。这是我在Ubuntu中的控制台I / O.当然,引号要明确地形成参数,以免它们被空格分隔。

$ ./a.out abc
not palindrome string
$ ./a.out aba
palindrome string
$ ./a.out abccba
palindrome string

如果您在Windows上运行命令提示符,请尝试

#include <stdio.h>
#include <string.h>

int isPalindrome(char*);

int main(int argc, char * argv[])
{
    /* Skip filepath (argv[0]); end of command line is marked with NULL. */
    for(int argIndex = 1; argv[argIndex] != NULL; ++argIndex)
    {
        isPalindrome(argv[argIndex])
        ? fprintf(stdout, "%s is a palindrome.\n", argv[argIndex])
        : fprintf(stdout, "%s is NOT a palindrome.\n", argv[argIndex]);
    }

    return 0;
}

int isPalindrome(char* pString)
{
    /* Ignore the terminator. */
    size_t lastIndex = strlen(pString) - 1;
    size_t middle = lastIndex / 2;
    /* Include the middle index in case the string length is an odd number. */
    for (size_t offset = 0; offset <= middle; ++offset) 
    {
        /* No need for flags, stop as soon as you see different letters. */
        if (pString[offset] != pString[lastIndex - offset]) 
        {
            return 0;
        }
    }
    /* Line only reached if all symmetrical letters are not different. */
    return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.